天天看點

MMAPI實作實時錄音

最近要做一個軟體,需要實時錄音,matlab似乎可以實作,但是好像也很麻煩。畢竟最後還是要在VS平台上做,是以就先開始試試實時錄音吧。

比之前播放用的Media Control Interface (MCI)要麻煩的多的時,實時錄音需要和聲霸卡進行通信,是以對硬體有一定的要求。部落客會認真給大家一點點分析,最終提供簡單易懂的代碼啦。

MMAPI可以把音頻流緩沖起來并一塊一塊地發送給你,我把這裡的音頻的最小機關稱為普朗克音頻(從普朗克時間和普朗克長度那裡獲得靈感啦)。它有固定的大小,需要一次性處理完畢,當然也可以開一個多線程來處理保證穩定。資料有多少位元組可以根據實際情況來設定。在性能和延遲之間均衡考慮一下,200ms的資料可以應付大多數情況。 

當然。。。其實我需要的是至少100ms的資料,暫且先這樣吧。。。

MMAPI的操作十分定式: 

首先了解MMAPI的回調函數:

MMAPI的回調函數: 

       這個回調函數是來處理消息的,一開始收到WIM_OPEN,最後收到WIM_CLOSE唯一頻繁收到的消息是WIM_DATA,得到這個消息時我們需要轉移緩沖區裡的資料并把緩沖區壓入到裝置緩沖隊列中,你可以了解為自動pop手動push。 

       開始錄音的流程為:以一種格式打開波形輸入裝置,發送WIM_OPEN消息給回調函數,準備緩沖區,添加緩沖區到裝置,告訴裝置錄音開始; 

具體操作:

       錄音期間循環發送WIM_DATA給回調函數; 

       結束錄音的流程為:告訴裝置錄音結束并發送WIM_DATA給回調函數讓它處理最後的資料,重置錄音裝置,釋放緩沖區,至此可以重新設定緩沖區到裝置并開始新的錄音,關閉裝置并發送WIM_CLOSE給回調函數。 

 這裡用到雙緩沖乃至多緩沖技術: 

       假設一個實時接水的任務,聽起來奇怪但與MMAPI的處理流程相似,這裡需要你用杯子連續接水,杯子相當于你開辟的緩沖區: 

       根據上面的​流程,你的身份是MMAPI的回調函數,在飲水機面前要拿着杯子執行這個任務:任務的基本名額是滴水不漏地連續用杯子把水接到一個存儲區域裡,你要接指定量的水,還要負責轉移走這杯水。為了能騰出時間把水倒在存儲區域裡,你肯定需要用不止一個杯子輪流接水。飲水機有一個功能:每當杯子灌滿後,飲水機會通知你,并自動去接下一個杯子,如果後面沒有杯子則終止任務。(不會講故事的我啊TT,這個奇葩例子能看懂就行)可以見得:1.你會被及時地通知去轉移資料2.緩沖區用完了要及時放回緩沖區隊列後端以保證任務能夠繼續3.如果轉移并處理資料的時間不是很穩定,你可能需要準備多個緩沖區而不是單純增加緩沖區容量,為的是確定任務中能夠預留足夠多的容忍時間供你使用。 

       這裡的多緩沖技術淺顯地解釋就是多個緩沖區排成一個隊列(或者了解為放成一摞)來抵消這個任務中那些耗時不穩定的處理過程對整個實時處理任務的連續性帶來的負面影響。其實生活中有很多事情也是用到多緩沖這個概念。

這是原作者講的哈,但是要是沒看懂的話,我給大家講一下我的了解:

我們用MCI函數庫能做到的是直接去錄音然後去放音。但是現在因為我需要每一段普朗克音頻的音量、頻率等資訊,是以直接錄音整段肯定是不符合要求的。是以我們需要把一整段給拆成好多個一小段。那錄這每一小段(即普朗克音頻)的時候,我不能說錄完這麼多音頻了,就給你處理,然後清空緩存區,再去錄音。這樣肯定會損失一定的音頻資訊。是以我們可以拿兩個緩沖區。一個緩沖區錄音,一個緩沖區處理,交替以往直到徹底完成任務。