将 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 文件的初始合并。或者,至少,如果我将它们与catffmpeg -f concat 合并,它会发生相同的情况


更新 3: 按照 @Mulvya 的建议,我观察到漂移率是恒定的(至少据我肉眼判断)。我也试过用另一个软件叠加A/V轨道,漂移完全一样,从而排除ffmpeg是罪魁祸首。我的(不好的)感觉是,这个问题可能与数码摄像机的内部时钟和用于录音的笔记本电脑的运行速率略有不同(参见here我刚刚发现的相同问题的报告)。

【问题讨论】:

有多少漂移,哪个晚了 - 音频还是视频? 音频在大约 30 分钟后缓慢漂移到视频后面几秒钟 您能否加载足够长的音频和视频样本以观察漂移? @Mulvya 我可以尝试,但原始视频是 2GB MTS 文件,我不确定以某种方式剪切/转换它是否已经引入了同步问题。我四处寻找,我想我会尝试插入-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 合并时,音视频同步漂移缓慢的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg - 合并图像和音频时,音频会缩短

ffmpeg合并音频和视频

将音频视频与ffmpeg合并时如何提高结果视频的质量?

ffmpeg+Python实现B站MP4格式音频与视频的合并

使用ffmpeg合并两个文件时获取异常

ffmpeg 命令创建可共享到 Instagram 等的 mp4 视频