Estoy tratando de usar FFmpeg para dividir video basado en algunos start_timey end_timeentradas, y reemplazarlos con otros archivos de video. Por ejemplo, para la entrada 10 15necesitaré reemplazar los segundos EXACTOS 10 to 15con 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 mediainfoherramienta 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 .mp4archivo original que funciona bien en el emulador.

.mp4archivo original si es necesario.Respuestas:
Usando
trimyconcat- 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
trimyconcat:Aquí,
trimse 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 av0través dev2. (Elsetptsfiltro 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=15lugar 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,
-crfpara 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
concatdemuxerEn principio, también puede intentar concatenar los flujos de bits sin volver a codificarlos, utilizando el demuxer concat. Cree un archivo llamado
concat.txty 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
concatprotocoloEl tipo de concatenación a nivel de archivo anterior también se puede lograr utilizando el
concatprotocolo, 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
concatmétodo arroja un error:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing inputconcatdemuxer, 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.