Python PyAudio混合多个曲目和频道

Python PyAudio混合多个曲目和频道,python,python-2.7,audio,portaudio,pyaudio,Python,Python 2.7,Audio,Portaudio,Pyaudio,我正在尝试将6个单声道音频输入通道(和一些wav文件)的音频混合到两个音频输出通道 我浏览了一遍,找到了如何访问我想要的声卡并获得音频。我注意到了channel map示例,但我对使用它有点困惑 我也发现了这一点,而且这项技术也会起作用,但对于6+频道来说,这不是有点慢吗 使用pyaudio混合多个声道的推荐或最有效的方法是什么?使用NumPy通过平均每个流的帧将两个流混合在一起 你担心这可能太慢了。我对此表示怀疑,因为NumPy只是在C中的C阵列上循环,就像专用软件混音器一样(无论是在您的声音

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

我浏览了一遍,找到了如何访问我想要的声卡并获得音频。我注意到了channel map示例,但我对使用它有点困惑

我也发现了这一点,而且这项技术也会起作用,但对于6+频道来说,这不是有点慢吗

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

使用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
要达到20毫秒,我必须混合387条流。6不会是个问题


如果这是一个问题,你需要做一些更棘手的事情,例如,预缓冲混合,这样你就有比单帧大得多的块要处理(在C中循环更多,在Python中更少),或者甚至访问一个硬件混合,而你可能无法通过PyAudio来完成。是什么让你认为在NumPy中混合会太慢?你真的认为用NumPy将6个不同的20ms帧组合在一起需要超过20ms的时间吗?还有,为什么不试试它而不是试着猜测呢?@abarnert很好,我一拿到硬件就会马上测试。我想我的问题的一个方面是确保我没有试图以某种奇怪的方式实现它,而pyaudio api可能已经提供了内置的东西,但我没有发现它。谢谢你分享这些结果(+1),我也一定要用声卡进行测试。@GeorgeProfenza:声卡在这里并不重要(除了可能间接影响PyAudio调用回调的频率之外);这更多的是您的CPU问题。无论如何,除非您确实需要访问声卡上的硬件混音器(在这种情况下,您不想使用PyAudio,但可以提供较低级别的访问),由操作系统中的自定义代码、声音服务器、声卡驱动程序或其他任何东西提供的软件混合,通过一个小的常量乘法器,充其量将比NumPy快;它们实际上都只是在C中的C数组上循环。