PyAudio 混合多个音轨和通道

PyAudio mixing multiple tracks and channels

我正在尝试将来自 6 个单声道音频输入通道(和一些 wav 文件)的音频混合到两个音频输出通道。

我浏览了 PyAudio documentation 并弄清楚了如何访问我想要的声卡并获取音频。我注意到频道映射示例,但我对使用它有点困惑。

我也发现了 并且这种技术可行,但是对于 6 个以上的通道,这会不会有点慢?

用 pyaudio 混合多个声道的推荐或最有效的方法是什么?

使用 NumPy 通过平均来自每个流的帧将两个流混合在一起。

您担心这可能太慢了。我对此表示怀疑,因为 NumPy 只是在 C 中的 C 数组上循环,就像专用软件混音器一样(无论是在您的声音服务器、声卡驱动程序还是某些 OS 级混音器中)。但与其猜测,不如让我们找出答案。

首先,假设我们正在处理 20 毫秒的帧,并且将针对每一帧调用我们的回调,因为这只是最坏的情况。为了具体起见,我们假设我们有 44.1KHz 的 16 位立体声流,所以每个都是 1764 个样本。所以,让我们用我能想到的最低效的方式写这个然后测试它:

In [4]: frame = np.zeros(1764, dtype=np.int16)
In [5]: %timeit np.mean([frame]*6, axis=0, dtype=np.int16)
1000 loops, best of 3: 1.01 ms per loop

为了达到 20 毫秒,我必须混合 387 个流。 6 不会有问题。

如果它一个问题,您需要做一些更棘手的事情——例如,预缓冲混合,这样您就可以处理比单帧大得多的块(更多循环在 C 中,在 Python 中更少),甚至可以访问硬件混音器——您可能无法通过 PyAudio 做到这一点。