将 wav 和 mp4 与 ffmpeg 合并时,音视频同步漂移缓慢
Posted
技术标签:
【中文标题】将 wav 和 mp4 与 ffmpeg 合并时,音视频同步漂移缓慢【英文标题】:Slow audio-video sync drift when merging wav and mp4 with ffmpeg 【发布时间】:2016-05-25 12:18:38 【问题描述】:我有一个只有一个视频流(无音频)的mp4
文件和一个wav
音频文件,我想使用ffmpeg
添加到视频中。音频和视频在会议期间同时录制,前者来自 PC 上的混音器输出,后者来自数字摄像机。
我正在使用这个ffmpeg
命令:
ffmpeg -i incontro3.mp4 -itsoffset 18.39 -i audio_mix.wav -c:v copy -c:a aac final-video.mp4
我在哪里使用-itsoffset 18.39
选项,因为我知道 18.39 秒是视频-音频延迟。
我遇到的问题是在输出文件中,而音频与开头的视频完美同步,它在看电影的过程中会慢慢失去同步。
如果视频文件上ffprobe
的输出是:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'incontro3.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.25.100
Duration: 00:47:22.56, start: 0.000000, bitrate: 888 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 886 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
Metadata:
handler_name : VideoHandler
音频文件的ffprobe
输出为:
Input #0, wav, from 'audio_mix.wav':
Metadata:
track : 5
encoder : Lavf57.25.100
Duration: 00:46:32.20, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
我正在使用最新的ffmpeg
Zeranoe windows build git-9591ca7 (2016-05-25)。
感谢期待任何帮助/想法!
更新 1: 看起来问题出在视频音频合并的上游,可能是在将摄像机生成的 MTS
文件连接和转换为mp4
视频。当我在理解方面取得任何进展时,我会跟进......
更新 2: 问题不在于相机生成的 MTS
文件的初始合并。或者,至少,如果我将它们与cat
或ffmpeg -f concat
合并,它会发生相同的情况
更新 3: 按照 @Mulvya 的建议,我观察到漂移率是恒定的(至少据我肉眼判断)。我也试过用另一个软件叠加A/V轨道,漂移完全一样,从而排除ffmpeg
是罪魁祸首。我的(不好的)感觉是,这个问题可能与数码摄像机的内部时钟和用于录音的笔记本电脑的运行速率略有不同(参见here我刚刚发现的相同问题的报告)。
【问题讨论】:
有多少漂移,哪个晚了 - 音频还是视频? 音频在大约 30 分钟后缓慢漂移到视频后面几秒钟 您能否加载足够长的音频和视频样本以观察漂移? @Mulvya 我可以尝试,但原始视频是 2GBMTS
文件,我不确定以某种方式剪切/转换它是否已经引入了同步问题。我四处寻找,我想我会尝试插入-af aresample=async=1000
选项,看看它是否允许ffmpeg
将音频与视频时间戳相匹配。虽然我不太确定该选项的真正作用......
我相信这不适用于 WAV。仅适用于包含时间戳的音频格式,并且这些时间戳忠实地表示录制时间。 2GB 太大了,所以我建议检查漂移率是否恒定,即 5 分钟后是否有 2 秒不同步,10 分钟后是否有 4 秒异步。这将阐明 aysnc 的性质。如果不规则,则说明视频或音频在录制过程中出现丢帧。
【参考方案1】:
由于漂移率是恒定的,您可以使用 FFmpeg 过滤器的组合来重新定时音频。
ffmpeg -i audio_mix.wav -af asetrate=44100*(10/9),aresample=44100 retimed.wav
这里,44100*(10/9)
表示实际编号。代表 1 秒声音的样本数,即如果在播放原始 WAV 100 秒后,刚刚听到的音频是第 90 秒,那么样本消耗率应该增加10/9
。这会产生非常规的采样率,因此添加了 aresample 以将其重新采样回标准速率。
【讨论】:
以上是关于将 wav 和 mp4 与 ffmpeg 合并时,音视频同步漂移缓慢的主要内容,如果未能解决你的问题,请参考以下文章