簡體   English   中英

使用Python sounddevice在兩個設備上進行多通道采集

[英]Using Python sounddevice for multichannel acquisition on two devices

我正在嘗試從RME Fireface UCX聲卡輸出多達4通道的音頻,並在miniDSP 16通道麥克風陣列上獲取16通道的音頻數據。 目前,如果我結合使用query_devices命令中列出的設備,則可以使16進2出系統正常工作,但似乎無法增加輸出通道的數量。

從設備列表中:

0 name:Microsoft Sound Mapper - Input input ch:2 out ch:0
1 name:ADAT (7+8) (RME Fireface UCX) input ch:2 out ch:0
2 name:Line (miniDSP micArray Multi-ch input ch:2 out ch:0
...
46 name:ASIO Fireface USB input ch:18 out ch:18
47 name:ASIO4ALL v2 input ch:2 out ch:2
48 name:miniDSP ASIO Driver input ch:16 out ch:2
...
60 name:Line (miniDSP micArray Multi-channels) input ch:16 out ch:0
72 name:Line (nanoSHARC micArray16 UAC2.0) input ch:16 out ch:0
73 name:Analog (1+2) (Fireface Analog (1+2)) input ch:0 out ch:8
74 name:Analog (1+2) (Fireface Analog (1+2)) input ch:2 out ch:0
...

因此,如果我有x(這是一個具有44100 * 5行乘以三列的numpy數組,表示以44.1 kHz(= fs)采樣的5秒3通道數據),我可以這樣做:

sd.default.device = [46, 46]
rx_data = sd.playrec(x, samplerate=fs, channels=8)

同時播放3個聲道輸出到我的揚聲器,並在RME聲卡輸入上獲得8個聲道。 同樣,如果我這樣做:

duration = 5
sd.default.device = [48, 48]
sd.rec(int(duration * fs), samplerate=fs, channels=16)

我可以讓miniDSP錄制16通道的音頻,持續5秒鍾。 另外,如果我這樣做:

sd.default.device = [60, 73]
rx_data = sd.playrec(x, samplerate=fs, channels=16)

我可以讓miniDSP h / w采集16通道的音頻,而RME僅輸出2通道(是的,盡管numpy數組有3列,並且設備列表說設備可以輸出8通道,但僅2通道?)。 沒關系,但是正如我所說,我希望有3或4個音頻輸出通道。

我考慮過組合ASIO設備,即

sd.default.device = [48, 46]
rx_data = sd.playrec(x, samplerate=fs, channels=16)

但這(並不奇怪)導致PortAudioError -9993 I / O設備的非法組合。

因此,我考慮使用InputStreams和OutputStreams,但是我並未完全遵循sounddevice文檔中的一些示例代碼。 但這也許是解決這個問題的方法嗎?

PortAudio庫(在sounddevice模塊中使用)實際上不允許具有不同輸入和輸出(硬件)設備的流。 它可能適用於某些主機API和設備的某些組合,但並未得到官方支持。

另請參閱https://github.com/spatialaudio/python-sounddevice/issues/154

您也許可以在操作系統級別將多個設備組合成一個“虛擬設備”,但是我不知道它是否/如何在Windows上運行(它可以在Linux / ALSA上使用配置文件.asoundrc和macOS運行。通過定義“匯總設備”)。

如果不是這種選擇,則可以使用不同的流進行輸入和輸出(如您在問題中所提到的)。 在這種情況下,輸入和輸出塊的時序通常不匹配,因此您不應該嘗試同步處理輸入和輸出。 您應該使用queue.Queue類的queue.Queue將音頻數據從輸入回調傳輸到輸出回調。

實際上,文檔中沒有任何示例。 但是您可以嘗試將rec_unlimited.py (用於輸入回調)與play_long_file.py (用於輸出回調)組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM