En ffmpeg, ¿cómo retrasar solo el audio de un video .mp4 sin convertir el audio?

44

En mi archivo .mp4 el retraso de audio es -3840 ms. Lo sincronicé en KMplayer, y no quiero usar MKVGUI para hacer un archivo .mkv. Solo necesito retrasar el audio por -3840 ms, todo lo demás intacto.
¿Cuál sería el comando correcto para lograr esto usando ffmpeg?
Apreciaría tu ayuda.

Alireza
fuente

Respuestas:

72

Si necesita retrasar el video en 3.84 segundos, use un comando como este:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 1:v -map 0:a -c copy "movie-video-delayed.mp4"

Si necesita retrasar el audio en 3.84 segundos, use un comando como este:

ffmpeg.exe -i "movie.mp4" -itsoffset 3.84 -i "movie.mp4" -map 0:v -map 1:a -c copy "movie-audio-delayed.mp4"

Asegúrese de que su compilación ffmpeg no sea demasiado antigua, más reciente que 2012 será suficiente.


Explicación

-itsoffset 3.84 -i "movie.mp4"

Desfase las marcas de tiempo de todas las transmisiones en 3.84 segundos en el archivo de entrada que sigue a la opción (movie.mp4).

-map 1:v -map 0:a

Toma la transmisión de video de la segunda entrada (retrasada) y la transmisión de audio de la primera entrada; ambas entradas pueden, por supuesto, ser el mismo archivo.

Se puede encontrar una explicación más detallada aquí:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/

Tejedor
fuente
2
¿Cómo eliges una pista de audio específica en lugar de retrasar todas las pistas de audio?
Freedo
1
Usando las capacidades de la opción de mapa . Primero necesita encontrar el índice de la secuencia de audio deseada en el archivo de entrada usando cualquiera de estos comandos: ffprobe.exe "input_file.mp4"o ffmpeg.exe -i "input_file.mp4" Supongamos que el índice de la secuencia de audio que se retrasará es 2 (es decir, la tercera secuencia) y que la entrada retardada es el segundo (como en mi ejemplo). Para retrasar solo la tercera transmisión, tome todas las demás transmisiones de la primera entrada y solo la transmisión de audio de la segunda entrada (retrasada):-map 0:0 -map 0:1 -map 1:2
Weaver
eso no es lo que quise decir. En este caso, todavía tengo que llamar a ffmpeg y analizar los resultados para encontrar los índices. ¿Hay un equivalente a decir -map eng
Freedo
Bueno, @Freedo, como ya le aconsejaron en superuser.com/questions/639402/… , lo que sugiere es posible al especificar flujos utilizando valores de metadatos, por ejemplo: -map 1:m:language:eng Sin embargo, tenga en cuenta que seleccionará todos los flujos. satisfaciendo el criterio, posiblemente incluyendo múltiples transmisiones de audio y / o subtítulos. Puede encontrar más información en stackoverflow.com/questions/46769419/…
Weaver
1
Que yo sepa -c copyse puede utilizar en lugar de -vcodec copy -acodec copy, y itsoffsetsólo afecta a vídeo, así que tal vez esto funcionaría de la misma ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"y retrasar el audio en su lugar simplemente añadir un signo negativo a la duración: -3.84.
miyalys
0

Hacer primer silencio de audio:

ffmpeg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 3 silence_3_sec.mp3

Luego archivos concat:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
Ivan Malyshev
fuente