前言
????本文在基于開發(fā)項(xiàng)目中的一個(gè)語音模塊功能所作出的對(duì)Audio Unit的使用的簡要總結(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)的音頻錄制過程進(jìn)行一個(gè)簡單的使用流程介紹掉伏。
使用流程概要
1.初始化Audio Unit
1).設(shè)置上下文描述信息,指定一個(gè)特定的音頻單元
其中componentType和componentSubType的值是根據(jù)不同的音頻單元來設(shè)置:具體可參考Identifier Keys for Audio Units
2).使用音頻單元API獲取一個(gè)音頻單元實(shí)例
AudioComponentFindNext函數(shù)的結(jié)果是對(duì)定義音頻單元的動(dòng)態(tài)鏈接庫的引用,將引用傳遞給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)一音源的感受不同帶來距離定位鹿寨,多聲道也是為了立體感,每個(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)系來分析:每秒有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ù)來計(jì)算牌柄。
2.開始錄制
3.停止錄制
其中代碼段中利用socket向服務(wù)器發(fā)送數(shù)據(jù)的相關(guān)信息在此將不再贅述畸悬。
以上描述僅用于iOS開發(fā)過程中基于Audio Unit音頻錄制的一個(gè)簡要的使用流程,同理對(duì)于音頻播放的使用流程類似珊佣。