iOS基于Audio Unit的實(shí)時(shí)音頻錄制流程

前言

????本文在基于開發(fā)項(xiàng)目中的一個(gè)語(yǔ)音模塊功能所作出的對(duì)Audio Unit的使用的簡(jiǎn)要總結(jié)。 在iOS中有很多方法可以進(jìn)行音視頻采集。如 AVCaptureDevice, AudioQueue以及Audio Unit。其中 Audio Unit是最底層的接口,其優(yōu)點(diǎn)在于功能強(qiáng)大,延遲低; 但弊端在于學(xué)習(xí)成本高,難度大。

對(duì)于iOS的Audio Unit一共三種設(shè)置:

1.一個(gè)IO Unit(其中remote io unit是iPhone 的三個(gè)IO Unit中的一個(gè))的element 1(bus 1)直接與設(shè)備上的輸入硬件(麥克風(fēng))相連;

2.一個(gè)IO Unit的element 0(也叫bus 0)直接與設(shè)備上的輸出硬件(比如揚(yáng)聲器)相連;

3.Remote IO Unit啟用了輸出而禁止了輸入。

對(duì)于其設(shè)計(jì)模式可分為兩種:1.錄音設(shè)計(jì):設(shè)置remote io unit的渲染回調(diào),從輸入硬件獲得采樣傳入到回調(diào)函數(shù)進(jìn)行渲染,從而獲得錄音數(shù)據(jù);2.放音設(shè)計(jì):設(shè)置remote io unit的輸入回調(diào).向回調(diào)函數(shù)填數(shù)據(jù),從而向輸出硬件提供數(shù)據(jù)進(jìn)行放音。

本文主要是針對(duì)iOS接入硬件設(shè)備麥克風(fēng)的音頻錄制過(guò)程進(jìn)行一個(gè)簡(jiǎn)單的使用流程介紹。

使用流程概要

1.初始化Audio Unit

1).設(shè)置上下文描述信息,指定一個(gè)特定的音頻單元

此代碼段僅指定一個(gè)音頻單元 -?Remote I/O unit,所有iOS音頻設(shè)備都使用componentManufacturer字段的kAudioUnitManufacturer_Apple密鑰。

其中componentType和componentSubType的值是根據(jù)不同的音頻單元來(lái)設(shè)置:具體可參考Identifier Keys for Audio Units

對(duì)于其他設(shè)備的描述信息可參照此圖進(jìn)行設(shè)置

2).使用音頻單元API獲取一個(gè)音頻單元實(shí)例

AudioComponentFindNext函數(shù)的結(jié)果是對(duì)定義音頻單元的動(dòng)態(tài)鏈接庫(kù)的引用,將引用傳遞給AudioComponentInstanceNew函數(shù)以實(shí)例化音頻單元。

3).創(chuàng)建錄制buffer,設(shè)置AudioBuffer的基礎(chǔ)信息,分配緩沖區(qū)

此實(shí)例設(shè)置的是單聲道,若需要設(shè)置立體聲,將上述Channels設(shè)置為2即可。同時(shí)為buffer段分配1024byte的緩沖區(qū)。

4).設(shè)置音頻流格式信息

mSampleRate為采樣率:即每秒鐘采樣的次數(shù)

幀frame:每一次采樣的數(shù)據(jù)對(duì)應(yīng)一幀

聲道數(shù)mChannelsPerFrame:人的兩個(gè)耳朵對(duì)統(tǒng)一音源的感受不同帶來(lái)距離定位,多聲道也是為了立體感,每個(gè)聲道有單獨(dú)的采樣數(shù)據(jù),所以多一個(gè)聲道就多一批的數(shù)據(jù)。

每一次采樣單個(gè)聲道的數(shù)據(jù)格式:由mFormatFlags和mBitsPerChannel確定。mBitsPerChannel:數(shù)據(jù)大小,即采樣位深,越大取值范圍就更大,不容易數(shù)據(jù)溢出。mFormatFlags里包含是否有符號(hào)、整數(shù)或浮點(diǎn)數(shù)、大端或是小端等。有符號(hào)數(shù)就有正負(fù)之分,聲音也是波,振動(dòng)有正負(fù)之分。這里采用s16格式,即有符號(hào)的16比特整數(shù)格式。

從層級(jí)關(guān)系來(lái)分析:每秒有SampleRate次采樣,每次采樣一個(gè)frame,每個(gè)frame有mChannelsPerFrame個(gè)樣本,每個(gè)樣本有mBitsPerChannel這么多數(shù)據(jù)。

5).設(shè)置輸入的回調(diào)函數(shù)

屬性kAudioOutputUnitProperty_SetInputCallback指定輸入的回調(diào),kInputBus為1,表示element1。

其中輸入的回調(diào)函數(shù)recordingCallbackStruct定義如下:

使用回調(diào)函數(shù)的目的在于:構(gòu)建AudioBufferList,使用AudioUnitRender實(shí)時(shí)獲取錄制的音頻數(shù)據(jù)。AudioBufferList的內(nèi)存數(shù)據(jù)需要我們自己分配,因此需要計(jì)算buffer的大小,根據(jù)傳入的樣本數(shù)和聲道數(shù)來(lái)計(jì)算。

2.開始錄制

3.停止錄制

其中代碼段中利用socket向服務(wù)器發(fā)送數(shù)據(jù)的相關(guān)信息在此將不再贅述。

以上描述僅用于iOS開發(fā)過(guò)程中基于Audio Unit音頻錄制的一個(gè)簡(jiǎn)要的使用流程,同理對(duì)于音頻播放的使用流程類似。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容