合并许多具有特定位置的音频文件

use*_*085 8 audio ffmpeg

我有多个代表会话的音频文件。所以在一个文件夹中我可能有:

2016-06-22-15-59-59-000.mka
2016-06-22-16-59-59-001.mka
2016-06-22-17-59-59-002.mka
Run Code Online (Sandbox Code Playgroud)

文件名是创建此文件的日期和时间。例如,第一个文件已于 6 月 22 日 15:59 创建。第二个在 16:59。

音频持续时间可能会有所不同,没有固定的持续时间。例如,用户可以连接到会话 5 秒或 10 分钟。所以第一个持续时间是 00:05,第二个是 10:00。

这些文件一起代表会话 - 这就是它们应该合并的原因。您可以将其视为多人拨打用于音频会议的同一个电话号码。

例如,Alice、Bob 和 John 想要讨论一些事情。爱丽丝正在拨打号码 555-111-22-33,鲍勃在 1 分钟后拨打同一个号码。他们一起聊了5分钟。30 分钟后,鲍勃和约翰同时拨打同一个号码。然后爱丽丝在 1 分钟后加入。

所以在这种情况下,我们有多个音频流。这些流通常会重叠,但并非总是如此。例如,当 Alice 在一开始等待 Bob 时,我们已经在录制她,并且此会话中没有其他人,因此此音频流不会与其他人重叠。

我正在寻找将每个人的录音合并为一个文件的最佳方式。所以在这个文件中,我们必须听到每个人的声音。在通话之间,当 Alice、Bob 和 John 不在会话中时,应该保持沉默。

我正在查看 ffmpeg 文档,但找不到可用于创建重叠流的选项,并指定流应该开始的确切时间。

你们知道什么是最好的方法吗?也许我需要比 ffmpeg 更好的工具,也许我只需要使用库和编程语言来创建自己的程序来做到这一点?谢谢

Gya*_*yan 10

让我们将第一个音频开始的相对时间指定为t=0。因此,如果第一个录音开始于16:59:23并且第三个录音开始于17:14:13,那么第三个的相对开始时间是14:50

考虑到这一点,基本的命令结构是

ffmpeg -i first.mka -i second.mka -i third.mka -i fourth.mka
       -filter_complex
         "[1]adelay=184000|184000[b];
          [2]adelay=360000|360000[c];
          [3]adelay=962000|962000[d];
          [0][b][c][d]amix=4"
merged.mka
Run Code Online (Sandbox Code Playgroud)

该命令的作用是延迟每个音频文件的相对开始时间,除了第一个以匹配其实际相对开始时间的文件。然后将所有延迟的音频流混合在一起。所述amix过滤器插入沉默在需要的地方。

adelay需要以毫秒为单位的值,所以 3 分钟,4 秒是 184 秒是184000毫秒。必须为音频流的每个通道提供一个值,因此如果您正在处理单声道流,则[1]adelay=184000[b]是语法。