pyaudio高級(jí)玩法4:使用不同的聲音設(shè)備
????????在這個(gè)系列的第一篇中,介紹了pyaudio的非阻塞模式,不過這個(gè)詞還是有點(diǎn)生僻的,所以很多人沒有明白代碼的意義,為了讓使用者少走彎路,所以在開始今天的正題之前,在這里補(bǔ)充說明一下。
????????

pyaudio錄音時(shí),經(jīng)常會(huì)有一邊錄音,一邊做其他事情的需求。
比如一邊錄音一邊保存,一邊錄音一邊處理?
你大概會(huì)想一些其他解決方案,比如使用多線程完成這樣的任務(wù)。
不過pyaudio是原生支持非阻塞模式記錄聲音的。
什么是非阻塞模式?
假設(shè)你使用一句編程代碼來實(shí)現(xiàn)記錄一秒鐘聲音這樣的工作,
這種時(shí)候程序的運(yùn)行一般有兩種情況:
第一種,在這個(gè)代碼執(zhí)行的1秒鐘時(shí)間內(nèi),程序就卡在這里等待其執(zhí)行完畢后,再處理后面的內(nèi)容。顯然,對(duì)于一臺(tái)計(jì)算機(jī)來說,這樣的處理模式效率不高。如果需要循環(huán)記錄聲音,那么在處理其他內(nèi)容的時(shí)候,也會(huì)造成聲音記錄這項(xiàng)工作被撕裂,導(dǎo)致記錄的聲音斷斷續(xù)續(xù)。
第二種情況,程序一旦啟動(dòng)錄音,剩下的工作都放在后臺(tái)運(yùn)行,程序則不會(huì)等待其執(zhí)行完畢,而是直接去執(zhí)行后面的語句。當(dāng)然,為了方便對(duì)聲音的處理,我們可以隨時(shí)去查看已經(jīng)錄到的內(nèi)容,或者查詢是否已經(jīng)錄制完畢。這樣充分解決了
網(wǎng)上一般給出的pyaudio代碼都是第一種情況,而實(shí)際上pyaudio可以直接支持第二種處理方式。而且設(shè)計(jì)非常完善,你所需要的只是添加一個(gè)回調(diào)函數(shù)。
具體怎么做?歡迎查看本系列的第一篇文章。

????????現(xiàn)在回過頭來,pyaudio的功能可不僅僅局限于使用阻塞和非阻塞的方式去記錄聲音,作為python管理聲音輸入輸出的主力庫,其也可以管理你計(jì)算機(jī)上的聲音輸入輸出設(shè)備。
????????以windows系統(tǒng)為例,我看先看一下在windows系統(tǒng)上如何管理這些設(shè)備。

這里可以管理windows的默認(rèn)音頻設(shè)備,它會(huì)影響到pyaudio的使用,當(dāng)然pyaudio也可以直接調(diào)用非默認(rèn)的音頻設(shè)備。
我們可以查看當(dāng)前計(jì)算機(jī)的音頻設(shè)備和編號(hào)。先看代碼:

import?pyaudio
p?=?pyaudio.PyAudio()
print(p)
for?i?in?range(p.get_device_count()):
????print(p.get_device_info_by_index(i))

b站對(duì)代碼的支持不太好,所以如果你復(fù)制粘貼這段代碼,需要將其中的空格替換會(huì)正常的空格。代碼本身還能更簡(jiǎn)單么?我認(rèn)為不能啦。
然后,看看我們能獲得什么。

返回的列表列出了本機(jī)上的所有音頻設(shè)備,包括實(shí)際上可用的和不可用的,還有一些實(shí)際上重復(fù)的。除了編號(hào),名稱,還包括了輸入和輸出的聲道數(shù)等信息。
一些設(shè)備從名稱上就可以分辨其到底是輸入設(shè)備,還是輸出設(shè)備,不過更保險(xiǎn)的方式是查看后面的maxinputchannel(最大輸入聲道數(shù))和maxoutputchannel(最大輸出聲道數(shù))。
列表可以看到,還是挺復(fù)雜的,如果不是有特殊需求(比如同時(shí)控制若然個(gè)不同的聲音設(shè)備),我建議你還是直接忽略這些,不指定設(shè)備參數(shù)時(shí),pyaudio會(huì)貼心的為你調(diào)用系統(tǒng)默認(rèn)的聲音設(shè)備。
知道了這些編號(hào),我們只需要在pyaudio中設(shè)置對(duì)應(yīng)的參數(shù)就可以啦??梢詤⒖忌弦黄a中的參數(shù)。
這里我直接把用到的部分搬過來。

是不是說的很詳細(xì)了呢?
雖然忘了提,上篇內(nèi)容其實(shí)也用到了pyaudio的輸出功能。
綜合這4篇文章,現(xiàn)在你應(yīng)該可以使用pyaudio徹底玩轉(zhuǎn)你計(jì)算機(jī)上的音頻功能啦。剩下的應(yīng)該只有用來處理聲音的各種算法了。