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

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

優(yōu)點:

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

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

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

CPU資源消耗較少

缺點:

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

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

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

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

AudioUnit示意圖

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

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é)對音頻數(shù)據(jù)進(jìn)行音效處理,F(xiàn)ormat Conversion負(fù)責(zé)格式轉(zhuǎn)換,比如重采樣等。這里有個優(yōu)化的點,由于Multichannel Mixer本身就有格式轉(zhuǎn)換的功能,輸入和輸出的音頻數(shù)據(jù)格式可以不同,因此利用這一點,可以節(jié)省一個格式轉(zhuǎn)換單元。

AudioUnit中的音頻采集

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

1.實例化AUGraph,添加units;

2.配置每個AudioUnit屬性;

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

4.建立units連接;

5.啟動AUGraph。

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

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

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

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

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

AudioUnit中的音效處理

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

混響效果

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

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

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

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

變聲效果

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

 

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

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

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

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

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

 

voixal voice changer軟件截圖

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

分享到

songjy

相關(guān)推薦