在ffmpeg中,如何在不转换音频的情况下仅延迟.mp4视频的音频?


40

在我的.mp4文件中,音频延迟为-3840毫秒。我在KMplayer中同步它,我不想使用MKVGUI来制作.mkv文件。我只需要将音频延迟-3840毫秒,其他一切都完好无损。
使用ffmpeg完成此操作的正确命令是什么?
我很感激你的帮助。

Answers:


65

如果您需要将视频延迟 3.84秒,请使用如下命令:

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

如果您需要将音频延迟 3.84秒,请使用如下命令:

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

确保你的ffmpeg版本不是太旧,比2012年更新就足够了。


说明

-itsoffset 3.84 -i "movie.mp4"

通过3.84秒,所述输入文件中的所有流的偏移时间戳如下选项(movie.mp4)。

-map 1:v -map 0:a

从第一个输入的第二个(延迟的)输入和音频流中获取视频流 - 两个输入当然可以是同一个文件。

可以在这里找到更详细的解释:http
//alien.slackbook.org/blog/fixing-audio-sync-with-ffmpeg/


1
如何选择一个特定的音轨而不是延迟所有音轨?
Freedo 2017年

使用map选项的功能。您首先需要使用以下任何命令在输入文件中找到所需音频流的索引:ffprobe.exe "input_file.mp4"或者ffmpeg.exe -i "input_file.mp4" 假设要延迟的音频流的索引是2(即第三个流),并且延迟输入是第二个(如我的例子)。要仅延迟第三个流,请从第一个输入中获取所有其他流,并从第二个(延迟)输入中仅获取一个音频流:-map 0:0 -map 0:1 -map 1:2
Weaver 2017年

这不是我的意思。在这种情况下,我仍然需要调用ffmpeg并解析结果以找到索引。有没有相当于说 - -map eng
Freedo于

好吧,@ Freeo,正如你在superuser.com/questions/639402 / ...中已经建议的那样,你建议的事实上可以通过使用元数据值指定流来实现,例如:-map 1:m:language:eng 但是,请记住,它会选择所有流满足标准,可能包括多个音频和/或字幕流。您可以在stackoverflow.com/questions/46769419
Weaver

1
AFAIK -c copy可以用来代替-vcodec copy -acodec copy,而且itsoffset只影响视频,所以这可能会起作用吗?ffmpeg -i "movie.mp4" -itsoffset 3.84 -c copy "movie-video-delayed.mp4"并且延迟音频而只是在持续时间中添加一个负号:-3.84
miyalys

0

制作第一个静音音频:

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

然后concat文件:

ffmpeg -i "concat:silence_3_sec.mp3|input.mp3" -acodec copy out.mp3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.