蘋果iOS系統(tǒng)音頻框架概覽

從上圖中可以看到,離底層驅(qū)動(dòng)和硬件最近的就是AudioUnit系列API。與其它聲音處理方案相比,AudioUnit包含以下這些優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

–低延時(shí),從采集到播放回環(huán)可到10ms這一級(jí)別

–動(dòng)態(tài)變更配置組合

–直接獲得后臺(tái)執(zhí)行權(quán)限

CPU資源消耗較少

缺點(diǎn):

–專有概念比較多,接口復(fù)雜

–提供C風(fēng)格API

由于AudioUnit并不完美,特別是專有概念比較多,接口也比較復(fù)雜,因此如果技術(shù)薄弱,在開發(fā)時(shí)難度會(huì)很大,金山云直播SDK解決了開發(fā)難度大等問題,這也是金山云SDK倍受歡迎的原因之一。

AudioUnit這個(gè)名字比較形象,它的主體是一系列單元節(jié)點(diǎn)(unit),不同的單元節(jié)點(diǎn)可實(shí)現(xiàn)不同的功能,將一個(gè)或多個(gè)單元節(jié)點(diǎn)添加到AUGraph(全稱是Audio Processing Graph,把各個(gè)unit組合在一起,起到管理作用)中,并建立單元節(jié)點(diǎn)之間的連接,音頻數(shù)據(jù)順次通過各個(gè)節(jié)點(diǎn),即可完成對(duì)聲音的采集、處理和播放。如下圖所示,AUGraph顯示出了這個(gè)音頻處理系統(tǒng)的構(gòu)成,提供了啟動(dòng)和停止處理系統(tǒng)的接口。

AudioUnit示意圖

如下方表格所示,蘋果iOS系統(tǒng)提供了四類單元節(jié)點(diǎn):

purposeAudio units

Effecteg. Reverb

mixingeg. Multichannel Mixer

I/Oeg. Remote I/O

Format conversioneg. Format Converter

其中,I/O主要負(fù)責(zé)設(shè)備,比如采集和播放;Mixing負(fù)責(zé)將不同來源的音頻數(shù)據(jù)進(jìn)行混合;Effect負(fù)責(zé)對(duì)音頻數(shù)據(jù)進(jìn)行音效處理,F(xiàn)ormat Conversion負(fù)責(zé)格式轉(zhuǎn)換,比如重采樣等。這里有個(gè)優(yōu)化的點(diǎn),由于Multichannel Mixer本身就有格式轉(zhuǎn)換的功能,輸入和輸出的音頻數(shù)據(jù)格式可以不同,因此利用這一點(diǎn),可以節(jié)省一個(gè)格式轉(zhuǎn)換單元。

AudioUnit中的音頻采集

在直播應(yīng)用中,我們主要使用Remote I/O unit進(jìn)行采集。由于一個(gè)AUGraph中只允許有一個(gè)I/O unit,因此Remote I/O需要同時(shí)負(fù)責(zé)采集和播放。當(dāng)用戶開啟耳返功能時(shí),需要將采集到的聲音,經(jīng)過處理后再送回當(dāng)前節(jié)點(diǎn)直接播放,這樣可將采集和播放的延時(shí)控制在50ms以內(nèi),主播和觀眾才不會(huì)察覺到聲音的延時(shí)。基本步驟如下(以下五個(gè)過程,均可在蘋果官方文檔中找到具體說明和代碼示例):

1.實(shí)例化AUGraph,添加units;

2.配置每個(gè)AudioUnit屬性;

3.設(shè)置渲染回調(diào)函數(shù)(Render Callback Function);

4.建立units連接;

5.啟動(dòng)AUGraph。

其中第4步較為關(guān)鍵,也就是設(shè)置渲染回掉函數(shù),以下是該回掉函數(shù)的函數(shù)聲明:

如上圖所示,AudioUnit每次都會(huì)處理一段音頻數(shù)據(jù),每次處理完成一段數(shù)據(jù)的時(shí)候,此前設(shè)置的回調(diào)函數(shù)就會(huì)被調(diào)用一次。在這個(gè)回調(diào)函數(shù)中,通過AudioUnit的AudioUnitRender,可從AUGraph中的某個(gè)節(jié)點(diǎn)中,獲取一段處理后的音頻PCM數(shù)據(jù)。同時(shí),如果需要進(jìn)行耳返播放,在這個(gè)回調(diào)中,也需要將取得的音頻數(shù)據(jù)送入到回調(diào)函數(shù)的最后一個(gè)參數(shù)ioData對(duì)應(yīng)的buffer中。

在設(shè)置單元節(jié)點(diǎn)屬性時(shí),需要注意里面包含的一些公共屬性。例如音頻格式屬性和MaximumFramesPerSlice。如果音頻格式設(shè)置錯(cuò)誤,容易出現(xiàn)AUGraph啟動(dòng)失敗、聲音異常等問題。在使用iOS內(nèi)置麥克風(fēng)或有線耳機(jī)時(shí),設(shè)備支持的采樣率較高,44.1KHz可正常工作,整條音頻通路基本都采用44.1KHz。當(dāng)使用藍(lán)牙設(shè)備時(shí),一般藍(lán)牙設(shè)備無法支持44.1KHz進(jìn)行采集和播放,通常是16KHz甚至更低,這會(huì)導(dǎo)致I/O Unit無法繼續(xù)使用之前的配置,需要按照實(shí)際支持的采樣率進(jìn)行配置。

AudioUnit還要求兩個(gè)單元銜接處的音頻數(shù)據(jù)格式必須保持一致,當(dāng)AUGraph中不同unit支持的格式不同時(shí)(比如在支持藍(lán)牙設(shè)備或者使用回聲消除模塊時(shí),I/O unit要求的格式和其它單元可能會(huì)不同),此時(shí)就需要分別設(shè)置格式,并通過unit或mixer unit對(duì)格式進(jìn)行轉(zhuǎn)換。

如果MaximumFramesPerSlice設(shè)置錯(cuò)誤,可能會(huì)出現(xiàn)聲音異常。MaximumFramesPerSlice表示的是每次回調(diào)送入或取出的音頻數(shù)據(jù)的長(zhǎng)度,在AUGraph所有節(jié)點(diǎn)的這個(gè)屬性,也需要保持一致,否則會(huì)導(dǎo)致其中一些unit丟棄數(shù)據(jù)而出現(xiàn)聲音異常。

AudioUnit中的音效處理

這里所謂的音效處理,主要是指對(duì)原本的聲音進(jìn)行改變,比如混響效果,變聲效果等。需要用到和數(shù)字信號(hào)處理有關(guān)的一系列時(shí)間和頻域工具,將PCM數(shù)據(jù)輸入,經(jīng)過運(yùn)算后得到變化后的聲音。

混響效果

我們?cè)谝魳窂d、劇院、禮堂等比較空曠的室內(nèi)說話或唱歌時(shí),能聽到和平時(shí)不同的聲音,原因是聲音在墻壁上多次反射后疊加在一起,就有了混響的效果。在聲音處理的過程中,可以人為將聲音緩存起來,延時(shí)一定時(shí)間后,和原聲音疊加,這樣就能夠模擬出混響效果。

AudioUnit提供了kAudioUnitSubType_Reverb2負(fù)責(zé)實(shí)現(xiàn)混響效果的生成,將該單元節(jié)點(diǎn)接入到AUGraph中之后,配置參數(shù)即可實(shí)現(xiàn)混響效果。雖然混響原理比較簡(jiǎn)單,但為了模擬自然界中的實(shí)際音效,這個(gè)計(jì)算過程還是相當(dāng)復(fù)雜的,因?yàn)樾枰M大小不一的空間,不同材質(zhì)的墻壁,包括障礙物的多少,都需要輸入很多參數(shù)參與運(yùn)算。對(duì)此,iOS的reverb unit提供了七種參數(shù)。金山云SDK在直播應(yīng)用中,可提供四種不同場(chǎng)景的模擬(錄音棚、演唱會(huì)、KTV、小舞臺(tái)),主要是通過調(diào)整如下參數(shù)實(shí)現(xiàn)的:

kReverb2Param_DryWetMix混響效果聲音的大小,與空間大小無關(guān),只與空間內(nèi)雜物多少以及墻壁和物體的材質(zhì)有關(guān);

kReverb2Param_DecayTimeAt0Hz/kReverb2Param_DecayTimeAtNyquist整個(gè)混響的總長(zhǎng)度,與空間大小有關(guān),越空曠,時(shí)間越長(zhǎng)。

變聲效果

變聲效果是在頻域上對(duì)人的聲音進(jìn)行處理,例如男聲一般比較低沉,女聲比較尖銳,這個(gè)主要說的是音調(diào),而通過對(duì)聲音音調(diào)的調(diào)整,可以讓低沉的男聲聽上去像尖銳的女聲。iOS提供的kAudioUnitSubType_NewTimePitch這一單元節(jié)點(diǎn),即負(fù)責(zé)音調(diào)的調(diào)整。值得注意的是,kAudioUnitSubType_NewTimePitch不是輸入Effect類,而是屬于FormatConverter類,通過設(shè)置TimePitch unit的kNewTimePitchParam_Pitch屬性即可。

 

如上圖所示,變男聲,需要強(qiáng)化突出低沉的特點(diǎn),將音調(diào)調(diào)低,設(shè)置負(fù)數(shù)參數(shù)即可;

變女聲,需要強(qiáng)化突出尖銳的特點(diǎn),將音調(diào)調(diào)高,設(shè)置正數(shù)即可;

機(jī)器人的音效是一個(gè)組合效果,在很多科幻電影中,機(jī)器人音調(diào)比較高,而且有重音,因此我們采用了TimePitch unit + Delay unit的方式。Delay unit也是iOS提供的一個(gè)將聲音延時(shí)疊加的單元節(jié)點(diǎn),比混音要簡(jiǎn)單很多,只有單次疊加;

莊嚴(yán)宏大音效一般自帶回聲,而且較男性化,因此金山云選擇了TimePitch unit + Reverb unit的方式實(shí)現(xiàn)。

這里推薦一個(gè)調(diào)節(jié)音效的參考軟件voxal voice changer。大家可以在這個(gè)軟件上將不同的工具組件進(jìn)行組合,通過調(diào)試參數(shù),即可實(shí)時(shí)聽到參數(shù)對(duì)應(yīng)的結(jié)果,效果滿意后再移植到AudioUnit中。

 

voixal voice changer軟件截圖

以上就是在iOS移動(dòng)設(shè)備直播時(shí)的音頻采集過程中,采用AudioUnit中的音效組件實(shí)現(xiàn)混響和變聲效果的大致過程。金山云的直播SDK目前已集成此功能,深受直播行業(yè)客戶的歡迎。實(shí)際上,AudioUnit還有很多功能沒有被挖掘出來,比如可將背景音樂、混音、回聲消除等其他移動(dòng)多媒體音頻相關(guān)的功能納入到這個(gè)框架中,對(duì)此,金山云正在深入探索,希望帶給直播用戶更多更好的體驗(yàn)。

分享到

songjy

相關(guān)推薦