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.