我有几对 wav 文件(通过从 VoIP 数据包捕获中恢复音频获得)。我想将这两个文件合并为一个单通道 WAV 文件,这很容易用ffmpeg
或 来sox
实现。但是,这两个文件的长度不同,我想将它们合并在一起,以便结尾文件的匹配项,而不是开始。
例如,有两个文件P0.wav
和P1.wav
。我想将两者合并在一起,以便 P0.wav 开始,然后混合 P1.wav,以便两个文件同时结束:
<-------P0.wav----> file 1
<---P1.wav----> file 2
我已经尝试了 ffmpeg 和 sox,两者都会将文件合并到单个通道,但结果是:
<-------P0.wav----> file 1
<---P1.wav----> file 2
有没有办法使用 ffmpeg 或 sox 来实现这一点,最好是“通用”的(即不需要对每个单独的文件进行示例并计算时间),以便我可以将其放入批处理中?
答案1
非常感谢@michaeljan 的启发,答案是反转两个文件,将它们合并在一起,然后再次反转它们。
ffmpeg -i p0.wav -i p1.wav -filter_complex "[0:a]areverse[1r];[1:a]areverse[2r];[1r][2r]amerge[m];[m]areverse[f]" -map "[f]" output.wav
这就是 filter_complex 的魔力:
- 将
p0.wav
其取反为[1r]
- 将
p1.wav
其取反为[2r]
- 合并
[1r]
并[2r]
一起[m]
- 反
[m]
转至[f]
..然后[f]
就是最终的文件。
一个小警告是合并文件的长度只与最短文件的长度相同:但是,在我的用例中,我实际上希望p0.wav
被截断以匹配长度p1.wav
- 如果这不是所需的效果,那么更改amerge
为amix
并使用持续时间选项应该修复这个问题。