我有多个代表该会话的音频文件。因此,在一个文件夹中,我可能有:
2016-06-22-15-59-59-000.mka
2016-06-22-16-59-59-001.mka
2016-06-22-17-59-59-002.mka
Filename 是创建此文件的日期和时间。例如,第一个文件创建于 6 月 22 日 15:59。第二个文件创建于 16:59。
音频时长可能有所不同,没有固定的时长。例如,用户可以连接到会话 5 秒或 10 分钟。因此第一个时长为 00:05,第二个时长为 10:00。
这些文件共同代表了会话 - 这就是它们应该合并的原因。您可以将其想象为多个人拨打同一个用于音频会议的电话号码。
例如,Alice、Bob 和 John 想要讨论某事。Alice 拨打了 555-111-22-33 号码,1 分钟后 Bob 又拨打了同一个号码。他们一起通话了 5 分钟。30 分钟后,Bob 和 John 同时拨打了同一个号码。1 分钟后,Alice 也加入进来。
因此,在这种情况下,我们有多个音频流。这些音频流通常会重叠,但并非总是如此。例如,当 Alice 一开始正在等待 Bob 时,我们已经在录制她的声音,并且此会话中没有其他人,因此此音频流不会与其他音频流重叠。
我正在寻找将每个人的录音合并到一个文件中的最佳方法。因此,在这个文件中我们必须听到每个人的声音。并且在通话之间,当 Alice、Bob 和 John 不在会话中时,应该保持安静。
我正在查看 ffmpeg 文档,但找不到可以用来创建重叠流的选项,并且指定流应开始的确切时间。
你们知道最好的方法是什么吗?也许我需要比 ffmpeg 更好的工具,也许我只需要使用库和编程语言来创建自己的程序来实现这一点?谢谢
答案1
我们将第一个音频的开始相对时间指定为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
该命令的作用是延迟除第一个音频文件之外的每个音频文件的相对开始时间,以匹配它们的实际相对开始时间。然后所有延迟的音频流混合在一起。过滤器amix
在需要时插入静音。
adelay
需要以毫秒为单位的值,因此 3 分 4 秒是 184 秒,即184000
毫秒。必须为音频流的每个通道提供一个值,因此如果您处理的是单声道流,则[1]adelay=184000[b]
语法如下。