使用 FFmpeg 将多个音频文件淡入淡出?

set*_*ouk 4 audio mp3 ffmpeg concatenation

使用 FFmpeg,我试图将许多音频文件组合成一个长文件,每个文件之间都有一个交叉淡入淡出。为了保持数字简单,假设我有 10 个输入文件,每 5 分钟,我希望每个文件之间有 10 秒的淡入淡出。(结果持续时间将为 48:30。)假设所有输入文件都具有相同的编解码器/比特率。

我惊喜地发现交叉淡入淡出两个文件是多么简单:

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.mp3
Run Code Online (Sandbox Code Playgroud)

但是acrossfade过滤器不允许 3+ 个输入。所以我天真的解决方案是重复运行ffmpeg,将前一个中间输出与下一个输入文件交叉淡入淡出。这并不理想。这让我想到两个问题:

1. 是否acrossfade无损复制流?(当然,除了它们正在主动淡入淡出的地方。)或者整个输入流都被重新编码了吗?

如果输入流完全重新编码,那么我的幼稚方法非常糟糕。在上面的示例中(调用acrossfade9 次),第一个文件的第一个 4:50 将被重新编码 9 次!如果我组合了 50 个文件,第一个文件会被重新编码 49 次!

2. 为了避免多次运行和重新编码问题,我可以在一次ffmpeg调用中实现多次交叉淡入淡出行为吗?

我想我需要一些很长的过滤器图,但我还没有弄清楚。有没有人有交叉淡入淡出3个输入文件的例子?从那以后,我可以自动化更长链的过滤器图。

感谢您提供任何提示!

Gya*_*yan 8

过滤器处理原始样本数据并输出相同的数据。解码发生在数据发送到过滤器之前,编码发生在所有过滤完成之后。因此,如果过滤器不修改数据的一部分,那么该部分将保持不变。

在您的命令中,您正在输出到 MP3,因此这确实会强制重新编码。您可以通过输出到 WAV 来避免这种情况,

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.wav
Run Code Online (Sandbox Code Playgroud)

您可以在最后的交叉淡入淡出命令期间输出到 MP3。

您还可以在一次呼叫中执行所有交叉淡入淡出。

4个文件的例子,

ffmpeg -i 0.mp3 -i 1.mp3 -i 2.mp3 -i 3.mp3 -vn
       -filter_complex "[0][1]acrossfade=d=10:c1=tri:c2=tri[a01];
                        [a01][2]acrossfade=d=10:c1=tri:c2=tri[a02];
                        [a02][3]acrossfade=d=10:c1=tri:c2=tri"
       out.mp3
Run Code Online (Sandbox Code Playgroud)