我正在尝试使用以下过程缩小视频(mp4 格式):
- 分割视频
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
- 并行缩小每个部分
ls output_*.mp4 | parallel ffmpeg -v quiet -i {} -vf scale=-2:<output-resolution> temp_{#}.mp4
- 合并片段以返回整个视频
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