videos unir two how example concatenate concatenar complex audio video ffmpeg concatenation
http://davidpennington.me/share/audio_sync_test_video.zip

audio - unir - how to merge two videos using ffmpeg



FFmpeg concat video y audio desincronizado (5)

Unir varios archivos con ffmpeg concat parece dar como resultado una falta de coincidencia de las marcas de tiempo o las compensaciones para el audio. He intentado con varios videos y he notado el mismo problema para h.264 / MP4.

Usar concat y codificar el video parece funcionar bien. El audio se mantiene sincronizado a medida que ffmpeg realiza los cálculos de conversión completos y parece que funciona correctamente.

Sin embargo, simplemente concatenar los videos sin ninguna transformación o codificación resulta en un problema de sincronización que aumenta lentamente. Obviamente, codificar los videos en lugar de simplemente unirse a ellos resultará en una pérdida de información / calidad, por lo que preferiría encontrar una solución a este problema.

He intentado varias marcas para solucionar este problema que parece estar basado en las marcas de tiempo. Sin embargo, ninguno de estos parece corregir el problema.

ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt test.mov ffmpeg -auto_convert 1 -f concat -fflags +genpts -async 1 -i segments.txt -c copy test2.mov ffmpeg -f concat -i segments.txt -c copy -fflags +genpts test3.mp4 ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt -copyts test4.mov ffmpeg -f concat -i segments.txt -copyts test5.mov ffmpeg -f concat -i segments.txt -copyts -c copy test6.mov ffmpeg -f concat -fflags +genpts -i segments.txt -copyts -c copy test7.mov

Nota: todas las demás preguntas que pude encontrar en SO parecen "arreglar" el problema simplemente codificando los videos nuevamente. No es una buena solución.

Actualizar

Me di cuenta de que el Concat no era el problema. El conjunto original de clips tenía marcas de tiempo mal emparejadas. De alguna manera, la codificación concat + solucionó el problema, pero no quiero volver a codificar los videos y perder calidad cada vez.

ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 output.MOV

Lo que resultó en los siguientes datos

ffprobe -v quiet -show_entries stream=start_time,duration output.MOV start_time=-0.247500 duration=6.131125 start_time=-0.257333 duration=6.155333

Desde entonces, he intentado usar -to m y -t en diferentes lugares junto con -af apad -c:v copy y todavía no he conseguido que la duración sea la misma.

Aquí está la salida completa de ffprobe

Aquí está el original (rojo) vs el segmento (verde)

Archivos de muestra detallados

Grabé un video de muestra, agregué los comandos para cortarlo y luego concentrarlo. http://davidpennington.me/share/audio_sync_test_video.zip


Encontré un problema similar y encontré una solución que funcionó, al menos para mí. En mi caso, también estaba concatenando archivos y encontré problemas de sincronización de audio / video con iOs, pero no con Windows (por ejemplo, el reproductor de medios VLC no mostró problemas de sincronización al usar el mismo archivo mp4). El síntoma de iOs al reproducir este mp4 concatenado fue inicialmente una buena sincronización, seguida de una pérdida de sincronización cada vez mayor a medida que se reproducía la película, con un audio más rápido que el video. Curiosamente, la sincronización podría restaurarse temporalmente al avanzar el control deslizante de progreso de la película a cualquier punto de la película, pero luego la sincronización se perdería nuevamente a medida que la película continuaba reproduciéndose en iOs. Al reproducir la misma película simultáneamente tanto en iOs como en Windows VLC, e inicialmente sincronizadas entre sí lo mejor que pude, al observar la evolución del "eco" entre ellas, llegué a la conclusión de que el audio de iOs iba demasiado rápido (asumiendo que El reproductor de Windows es correcto).

Para mí, la solución fue agregar la opción de filtro de audio -af aresample=async=1000 al comando ffmpeg, que encontré como ejemplo en la documentación en línea de ffmpeg y usé textualmente. No sé si esta configuración es óptima, pero el resultado fue un mp4 con audio y video que permanecen sincronizados cuando se reproducen tanto por iOs como por VLC. Esta opción de ffmpeg produjo la sincronización correcta de iOs tanto durante la concatenación como después de la recodificación del archivo ya concatenado.


Este proceso de dos pasos debería funcionar

Paso 1 Pasa el audio en cada segmento

ffmpeg -i segment1.mov -af apad -c:v copy <audio encoding params> -shortest -avoid_negative_ts make_zero -fflags +genpts padded1.mov

O

Generar segmentos con flujos sincronizados.

ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 -avoid_negative_ts make_zero -fflags +genpts segment.MOV

Paso 2 Concat

ffmpeg -f concat -i segments.txt -c copy test.mov

donde segments.txt consiste en los nombres de los archivos rellenados.


Puedes usar filter_complex para filter_complex diferentes opciones de una sola vez.

fmpeg -i input1.mp4 -i input2.webm / -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" / -map "[v]" -map "[a]" <encoding options> output.mkv


Si los videos de entrada se han codificado con la misma configuración, puede utilizar mkvmerge desde mkvtoolnix en su lugar:

mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv

Necesitaba concatenar videos de diferentes fuentes codificadas con diferentes configuraciones, así que usé un comando como este para redimensionar y recodificar primero los videos de entrada:

for f in *.mp4;do width=1280;height=720;ffmpeg -i $f -filter:v "scale=iw*min($width/iw/,$height/ih):ih*min($width/iw/,$height/ih), pad=$width:$height:($width-iw*min($width/iw/,$height/ih))/2:($height-ih*min($width/iw/,$height/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done

Algunos de los videos no tenían un canal de audio, así que tuve que usar un comando como este para agregarles un canal de audio silencioso:

for f in *.mkv;do ffprobe $f|&grep -q ''1: Audio''||{ ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv temp-$f $f; };done

Luego concatené los videos usando un comando como este:

mkvmerge -o output.mkv $(printf %s//n *.mkv|sed ''1!s/^/+/'')


También he estado luchando con esto durante bastante tiempo. Particularmente cuando se trabaja con archivos MTS generados por AVCHD de Panasonic. Mi solución actual es concatenarlos en el nivel del sistema operativo no ffmpeg. Hago esto en windows y se ve algo como esto:

COPY /b input_1.mts + input_2.mts + input_3.mts output.mts

En linux debería ser algo como:

$ cat input_1.mts input_2.mts input_3.mts > output.mts

Puede buscar documentación para las concatenaciones binarias de windows y linux .

Este método de concatenación como se aplica a la transcodificación es el camino a seguir si el formato original funcionará para usted. Este método prácticamente no utiliza procesamiento de CPU y preserva la calidad original. Un ganar-ganar cuando se trata de medios a granel de alta calidad.