如何连接多个音频输出通道以与PyAudio一起使用?

时间:2017-12-25 15:19:58

标签: python audio playback pyaudio

我是PyAudio和音频操作的新手,所以这是一个我无法找到答案的基本问题 - PyAudio为您提供了通过频道地图向不同频道发送声音的选项,但是你如何将这些不同的频道连接到你的计算机/ python上?

是否像配对蓝牙音箱那样简单,因此将我的电脑的内置扬声器作为一个通道,将蓝牙扬声器作为第二个?

(最终我想同时播放2个.wav文件,但是分别在2个不同的输出上播放。如果有比PyAudio更容易的方式,请听听这个!)

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

我相信使用sounddevice可能会有这种感觉。请参阅链接以获取安装详细信息。

sounddevice提供了一种使用sd.query_devices()列出不同输入/输出音频设备的简便方法

>>> print sd.query_devices()
   0 Microsoft Sound Mapper - Input, MME (2 in, 0 out)
>  1 Jack Mic (IDT High Definition A, MME (2 in, 0 out)
   2 Microphone Array (IDT High Defi, MME (2 in, 0 out)
   3 Microsoft Sound Mapper - Output, MME (0 in, 2 out)
<  4 Speakers / Headphones (IDT High, MME (0 in, 2 out)
   5 Communication Headphones (IDT H, MME (0 in, 2 out)

这里设备id(4)是输出设备(扬声器)。我没有配置bluetooth。但如果你有,它应该显示在列表中。

列出两个输出设备后,您只需使用重定向它们即可 sd.play(data_array, sampling_frequency, device=device_id_)

虽然sounddevice在播放过程中有阻止IO的限制,但我相信可以通过使用线程来克服它。

注意:以下代码未在两个不同的设备上进行测试。如果有效,请告诉我。

import sounddevice as sd
import soundfile as sf
import threading
from threading import Thread

def audioFunc1():
    audio1 = "audio1.wav"
    data1, fs1 = sf.read(audio1, dtype='float32')
    sd.play(data1, fs1, device=3)   #speakers

def audioFunc2():
    audio2 = "audio2.wav"
    data2, fs2 = sf.read(audio2, dtype='float32')
    sd.play(data2, fs2, device=10)  #headset

if __name__ == '__main__':
    Thread(target = audioFunc1).start()
    Thread(target = audioFunc2).start()