No ffmpeg, como atrasar apenas o áudio de um vídeo .mp4 sem converter o áudio?

44

No meu arquivo .mp4, o atraso do áudio é de -3840 ms. Eu o sincronizei no KMplayer e não quero usar o MKVGUI para criar um arquivo .mkv. Eu só preciso atrasar o áudio em -3840 ms, tudo intacto.
Qual seria o comando certo para fazer isso usando o ffmpeg?
Gostaria muito de receber sua ajuda.

Alireza
fonte

Respostas:

72

Se você precisar atrasar o vídeo em 3,84 segundos, use um 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"

Se você precisar atrasar o áudio em 3,84 segundos, use um 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"

Certifique-se de que sua compilação ffmpeg não seja muito antiga, mais recente que 2012 será suficiente.


Explicação

-itsoffset 3.84 -i "movie.mp4"

Desloca os carimbos de data e hora de todos os fluxos em 3,84 segundos no arquivo de entrada que segue a opção (movie.mp4).

-map 1:v -map 0:a

Obtém fluxo de vídeo da segunda entrada (atrasada) e fluxo de áudio da primeira entrada - é claro que ambas as entradas podem ser o mesmo arquivo.

Uma explicação mais detalhada pode ser encontrada aqui:
http://alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/

Tecelão
fonte
2
Como você escolhe uma faixa de áudio específica em vez de atrasar todas as faixas de áudio?
Freedo
1
Usando os recursos da opção de mapa . Você primeiro precisa encontrar o índice do fluxo de áudio desejado no arquivo de entrada usando qualquer um destes comandos: ffprobe.exe "input_file.mp4"ou ffmpeg.exe -i "input_file.mp4" Vamos supor que o índice do fluxo de áudio a ser atrasado seja 2 (ou seja, o terceiro fluxo) e que a entrada atrasada seja a segundo (como no meu exemplo). Para atrasar apenas o terceiro fluxo, pegue todos os outros fluxos da primeira entrada e apenas um fluxo de áudio da segunda entrada (atrasada):-map 0:0 -map 0:1 -map 1:2
Weaver
isso não é o que eu quis dizer. Nesse caso, ainda tenho que chamar ffmpeg e analisar os resultados para encontrar os índices. Existe um equivalente a dizer
-map
Bem, @ Freedo, como você já foi aconselhado em superuser.com/questions/639402/… , o que você sugere é de fato possível especificando fluxos usando valores de metadados, por exemplo: -map 1:m:language:eng No entanto, lembre-se de que ele selecionará todos os fluxos satisfazendo o critério, possivelmente incluindo vários fluxos de áudio e / ou legendas. Você pode encontrar mais informações em stackoverflow.com/questions/46769419/…
Weaver
1
AFAIK -c copypode ser usado em vez de -vcodec copy -acodec copy, e itsoffsetafeta apenas vídeo, então talvez isso iria funcionar da mesma ?: ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"e para atrasar o áudio em vez de simplesmente adicionar um sinal negativo com a duração: -3.84.
miyalys
0

Faça o primeiro áudio de silêncio:

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

Em seguida, concatize os arquivos:

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