Estoy tratando de usar FFmpeg para dividir video basado en algunos start_time
y end_time
entradas, y reemplazarlos con otros archivos de video. Por ejemplo, para la entrada 10 15
necesitaré reemplazar los segundos EXACTOS 10 to 15
con otro video.
OKAY. Lo que viene a mi mente es esto:
- Primero divida el video (en este caso, 0-10, 10-15 y 15 finales)
- Reemplace el 10-15 con el otro video
- Fusionar todos los sub-videos
Primera pregunta: ¿Es esta la mejor y más rápida solución? ¿Tenemos un comando más fácil u otras herramientas para reemplazar un período específico de tiempo en video con otro video?
Segunda pregunta: suponiendo que FFmpeg es la solución viable, cuando simplemente uso el comando ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4
, mi código de procesamiento de video no puede leer y procesar el archivo. Utilicé la mediainfo
herramienta para comparar los dos archivos y noté diferencias en los tamaños de encabezado, mientras que todas las cosas relacionadas con el códec de video eran iguales. Noté que el TAMAÑO DEL CABEZAL es diferente, lo que aparentemente está causando el problema. ¿Hay alguna forma de forzar que el tamaño del encabezado también (aparte de los códecs) sea el mismo?
ACTUALIZACIÓN: Aquí está el .mp4
archivo original que funciona bien en el emulador.
.mp4
archivo original si es necesario.Respuestas:
Usando
trim
yconcat
- archivos fuente con diferentes códecsPara ello, asegúrese de que sus archivos individuales tengan la misma resolución y, idealmente, la misma velocidad de fotogramas y submuestreo de croma, etc. Esto evitará errores o fallas durante la concatenación.
Puede hacer todo de una vez sin dividir el archivo, utilizando los filtros
trim
yconcat
:Aquí,
trim
se usa para especificar las porciones individuales de las transmisiones de video de entrada (0:v
,1:v
) que luego desea concatenar. Estas partes se nombran av0
través dev2
. (Elsetpts
filtro restablece las marcas de tiempo de estas partes individuales a 0, lo cual es necesario para la concatenación). Más tarde, concatenamos las tres partes.Si desea recortar desde una determinada marca de tiempo hasta el final, use en
trim=start=15
lugar de especificar el rango.Si sus archivos tienen audio, debe recortar esas transmisiones por separado:
Tenga en cuenta que el video y el audio se volverán a codificar en este caso; asegúrese de especificar los objetivos de calidad de salida adecuados (por ejemplo,
-crf
para x264, x265 o libvpx-vp9). Puede leer más sobre esto en FFmpeg Wiki, por ejemplo, para VP9 o H.264 .Usando segmentos individuales
Si desea dividir los clips y luego volver a ensamblarlos:
Si los archivos tienen audio, utilice el mismo enfoque que el anterior:
Esto volverá a codificar nuevamente la transmisión de video. Es un poco más sencillo, pero de lo contrario debería ser equivalente al método anterior.
Usando
concat
demuxerEn principio, también puede intentar concatenar los flujos de bits sin volver a codificarlos, utilizando el demuxer concat. Cree un archivo llamado
concat.txt
y agregue las siguientes entradas (correspondientes a los videoclips creados anteriormente):Luego concatene estos archivos individuales:
Sin embargo, esto requiere que sus clips tengan el mismo códec, resolución, velocidad de cuadros, etc., por lo que no funciona con todo tipo de fuentes heterogéneas.
Utilizando el
concat
protocoloEl tipo de concatenación a nivel de archivo anterior también se puede lograr utilizando el
concat
protocolo, con el mismo tipo de restricciones que el anterior (mismo códec, resolución, etc.):Para obtener más información sobre la concatenación, lea la página Wiki de FFmpeg correspondiente .
fuente
concat
método arroja un error:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
concat
demuxer, la sintaxis era diferente. Corregido ahora. Para ir hasta el final, usetrim=start=15
, consulte la documentación del filtro de recorte: ffmpeg.org/ffmpeg-filters.html#trim : en cuanto a los problemas de tiempo, esto realmente depende de su material de origen. Sin embargo, no he tenido problemas para concatenar con el clip que subiste.