ffmpeg 中的视频缩放会导致音频间隙

ffmpeg 中的视频缩放会导致音频间隙

我正在尝试使用以下过程缩小视频(mp4 格式):

  1. 分割视频
ffmpeg -v quiet -i <input-file> -map 0 -c copy -f segment -segment_time <segment_length> -reset_timestamps 1 -avoid_negative_ts make_non_negative output_%03d.mp4 
  1. 并行缩小每个部分
ls output_*.mp4 |  parallel ffmpeg -v quiet -i {} -vf scale=-2:<output-resolution> temp_{#}.mp4
  1. 合并片段以返回整个视频
for i in temp_*.mp4; do echo file "$i"; done > concat.txt
ffmpeg -v quiet -f concat -i concat.txt -codec copy <output-file>

然而,最终输出包含小的音频间隙。假设片段长度为 15 秒,那么在大约 15.28 秒处音频流中会出现间隙,如下面的音频波形所示。

音频波形

绿色部分突出显示了使用此命令缩小视频生成的音频波形:

ffmpeg -v quiet -i <input-file> -vf scale=-2:<output-resolution> <output-file>

黄色部分突出显示了使用前面描述的分割过程缩小的音频波形。

我能想到的一个方法是在分割时只处理视频流,并将音频流从输入文件直接复制到输出文件。但这又可能导致音频同步问题。我该如何解决这个问题?

我在 Windows 10 中使用 ffmpeg 版本 git-2020-03-03-60b1f85。

请注意,我不想重新编码视频,因为这首先会违背分段的目的(就所花费的时间而言)。

答案1

产生间隙的不是视频缩放,而是在消除时间戳的同时进行分割和连接的过程。

这是广播行业中相当常见的问题,我们通常这样解决:

  • 使用hls分割器分割音频和视频使用段列表文件
  • 对各片段进行并行视频处理不改变时间戳和音频处理 i/a
  • 通过将 ffmpeg 指向段列表文件,不是连接文件

例子

分裂:

ffmpeg -y -i ... -dn -sn -an -c:v copy -bsf:v h264_mp4toannexb -copyts -start_at_zero -f segment -segment_list /path/to/output.m3u8 -segment_time 30 /path/to/folder/para%05d.ts -dn -sn -vn -c:a copy /path/to/audiofile

重新加入:

ffmpeg -y -i /path/to/output.m3u8 -i /path/to/audiofile -map '0:v' -map '1:a' -c:a copy -c:v copy /path/to/output.mp4

相关内容