使用 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
但是acrossfade
过滤器不允许 3+ 个输入。因此,我的简单解决方案是重复运行ffmpeg
,将前一个中间输出与下一个输入文件交叉淡入淡出。这并不理想。这引出了两个问题:
1. 是否acrossfade
无损复制流?(当然,除非他们主动进行交叉淡入淡出。)或者整个输入流都被重新编码?
如果输入流全部重新编码,那么我的幼稚方法就很糟糕。在上面的例子中(调用acrossfade
9 次),第一个文件的前 4:50 将被重新编码 9 次!如果我合并 50 个文件,第一个文件将被重新编码 49 次!
ffmpeg
2. 为了避免多次运行和重新编码问题,我可以在一次调用中实现多次交叉淡入淡出行为吗?
我想我需要一些较长的滤镜图,但我还没有想出来。有人有仅对 3 个输入文件进行淡入淡出的示例吗?从那里我可以自动化更长链的滤镜图。
谢谢您的任何提示!
答案1
过滤器处理原始样本数据并输出相同的数据。解码发生在数据发送到过滤器之前,编码发生在所有过滤完成后。因此,如果过滤器不修改数据的一部分,那么该部分将保持不变。
在您的命令中,您正在输出到 MP3,因此这确实会强制重新编码。您可以通过输出到 WAV 来避免这种情况,
ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.wav
您可以在最后的交叉淡入淡出命令期间输出到 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