当使用 -filter_complex 与音频和视频过滤器时,FFmpeg -shortest 不起作用

当使用 -filter_complex 与音频和视频过滤器时,FFmpeg -shortest 不起作用

几乎描述了完全相同的问题这里几年前,但给出的“解决方案”虽然有效,但却比较不方便,并且没有解释为什么实际的命令不起作用。

我使用以下命令混合音频input.mp4song.m4a确保输出文件的尺寸为偶数:

ffmpeg -i input.mp4 -i song.m4a -filter_complex \
[0:a][1:a]amix[s0];[0:v]pad=height=ceil(ih/2)*2:width=ceil(iw/2)*2[s1] \
-map [s0] -map [s1] -shortest output.mp4

input.mp4只有大约 20 秒长,但song.m4a大约 8 分钟长。我想将两个音频流混合在一起,以便前 20 秒song.m4a与原始音频一起播放input.m4a。为了确保输出文件不会长达 8 分钟,我使用了选项-shortest,这应该会让 FFmpeg 在达到最短的音频/视频流时停止编码。但是,在上面的命令中,-shortest似乎没有完全起作用。

当我将音频和视频过滤器分成两个独立的-filter_complex部分时,它可以按预期工作(这样做也是顶部链接的问题中给出的解决方案):

ffmpeg -i input.mp4 -i song.m4a -filter_complex \
[0:a][1:a]amix[s0] -filter_complex [0:v]pad=height=ceil(ih/2)*2:width=ceil(iw/2)*2[s1] \
-map [s0] -map [s1] -shortest output.mp4

如果我完全删除视频过滤器,情况也是一样:

ffmpeg -i input.mp4 -i song.m4a -filter_complex [0:a][1:a]amix[s0] -map [s0] -map 0:v -shortest output.mp4

使用上述两个命令可以生成预期长度为 20 秒的视频。

我想我的问题是,为什么-shortest在单个-filter_complex参数中同时组合音频和视频过滤器时会变得多余?这是一个错误,还是预期的行为?如何仅使用一个 -filter_complex 即可使其按预期工作?

我在 Linux 上使用自编译的 FFmpeg 版本(使用撰写本文时最新的 Git 版本),但我可以确认我也可以使用官方 Linux 和 Windows 版本重现该问题,即使使用不同的音频和视频文件也是如此。


使用以下命令可以轻松重现该问题:

// Create video file
ffmpeg -f lavfi -i testsrc2 -f lavfi -i sine=2000 -t 5 -y input.mp4

// Create song file
ffmpeg -f lavfi -i sine=500 -t 10 -y song.m4a

// Combine both files (-shortest should work here but it does not)
ffmpeg -i input.mp4 -i song.m4a -lavfi [0:a][1:a]amix[s0];[0:v]null[s1] -map [s0] -map [s1] -shortest -y output.mp4

我也开了一个票在 FFmpeg Trac 上,它的回复提供了更多有用的信息。

相关内容