PyAudio混合多个轨道和通道

时间:2015-05-17 23:21:39

标签: python python-2.7 audio portaudio pyaudio

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

我已经浏览了PyAudio documentation,并想出了如何访问我想要的声卡并获得音频。我注意到了频道图的例子,但我对使用它感到有些困惑。

我也发现了this answer这种技术可行,但对于6个以上的频道,这不会有点慢吗?

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

1 个答案:

答案 0 :(得分:3)

The answer you linked to使用NumPy通过平均每个流的帧来混合两个流。

你担心这可能太慢了。我对此表示怀疑,因为NumPy只是在C语言中循环一个C数组,就像专用软件混音器一样(无论是在声音服务器,声卡驱动程序还是某些操作系统级混音器中)。但不是猜测,而是让我们发现。

首先,让我们假设我们处理的是20ms的帧,并且每个帧都会调用我们的回调,因为这只是最糟糕的情况。让我们假设我们已经获得了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

要达到20ms,我必须混合387个流。 6不会成为问题。

如果它 是一个问题,你需要做一些比较棘手的事情 - 例如,预混合混合使你有比单帧更大的块来处理(在C中更多的循环,更少的Python),甚至可以访问硬件混音器 - 你可能无法通过PyAudio来完成。