溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS音頻采集過程中的音效實(shí)現(xiàn)

發(fā)布時(shí)間:2020-06-30 10:46:20 來源:網(wǎng)絡(luò) 閱讀:2433 作者:敏哥侃視界 欄目:移動(dòng)開發(fā)

1、背景

在移動(dòng)直播中, 聲音是主播和觀眾互動(dòng)的重要途徑之一, 為了豐富直播的內(nèi)容,大家都會(huì)想要在聲音上做一些文章, 在采集錄音的基礎(chǔ)上玩一些花樣。

比如演唱類的直播間中, 主播伴隨著背景音樂演唱. 這時(shí)有些主播就會(huì)希望能夠給自己聲音增加混響的效果, 營(yíng)造出在舞臺(tái)劇場(chǎng)等環(huán)境下演唱的氛圍. 再比如有些搞笑類的直播間, 主播會(huì)希望給自己的聲音添加變聲的效果, 女變男,男變女或者變成機(jī)器人等等. 為了實(shí)現(xiàn)這些需求我們需要對(duì)采集的聲音進(jìn)行處理, 并且為了讓主播實(shí)時(shí)聽到這些處理后的效果,以便根據(jù)效果進(jìn)行調(diào)整,我們也需要提供低延時(shí)的回放,將變化后的聲音播放給主播聽.對(duì)聲音處理的方案比較多,這里介紹一下金山云直播SDK中所采用的基于iOS提供的AudioUnit的方案。

iOS系統(tǒng)提供了非常豐富的音頻相關(guān)的API,涵蓋了從采集,處理到播放等各個(gè)環(huán)節(jié),并且按照需求的層次進(jìn)行了分組。
iOS音頻采集過程中的音效實(shí)現(xiàn)
圖1. Core Audio Overview
其中,離底層的驅(qū)動(dòng)和硬件最近的就是AudioUnit系列的API,很多其他高層的API,都是對(duì)AudioUnit的封裝. 比如AVFoundation、AudioQueue、AVAudioEngine等。

缺點(diǎn):

涉及到的專有概念比較多,接口復(fù)雜

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

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

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

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

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

  1. AudioUnit簡(jiǎn)介

AudioUnit這個(gè)名字取得還是比較形象的,它的主體就是一系列的unit,不同unit能夠?qū)崿F(xiàn)不同的功能,將一個(gè)或多個(gè)unit添加到AUGraph(Audio Processing Graph)中,并建立unit之間的連接,音頻數(shù)據(jù)順次通過各個(gè)節(jié)點(diǎn)即可完成我們最終需求。
iOS音頻采集過程中的音效實(shí)現(xiàn)
圖2. AudioUnit in iOS
iOS系統(tǒng)一共提供了如下4類unit。
iOS音頻采集過程中的音效實(shí)現(xiàn)
其中,I/O主要負(fù)責(zé)和設(shè)備打交道,比如采集和播放;Mixing負(fù)責(zé)將不同來源的音頻數(shù)據(jù)進(jìn)行混合;Effect是對(duì)音頻數(shù)據(jù)進(jìn)行音效處理;Format Conversion主要是進(jìn)行格式轉(zhuǎn)換比如重采樣等。這里有一個(gè)優(yōu)化的點(diǎn)是音頻格式轉(zhuǎn)換 Multichannel Mixer 本身就能夠?qū)崿F(xiàn)格式轉(zhuǎn)換的功能,輸入和輸出的音頻數(shù)據(jù)格式可以不同,利用這一點(diǎn)可以節(jié)省一個(gè)格式轉(zhuǎn)換unit。

  1. 使用AudioUnit進(jìn)行音頻采集

在直播應(yīng)用中,我們主要是使用Remote I/O unit來進(jìn)行采集工作。 在一個(gè)AUGraph中只允許有一個(gè)I/O unit。Remote I/O需要同時(shí)負(fù)責(zé)采集和播放的功能。當(dāng)用戶開啟耳返功能時(shí),要將采集到的聲音,處理之后再送回當(dāng)前節(jié)點(diǎn)直接播放,這樣可以將采集和播放的延時(shí)控制在50ms以內(nèi),主播才察覺不到聲音的延時(shí)。 基本的步驟如下:

  1. 實(shí)例化AUGraph,將用到units添加進(jìn)去;

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

  3. 設(shè)置Render Callback Function;

4.將units 建立連接;

5.啟動(dòng)AUGraph。

以上過程大家都可以到Apple官方的文檔中找到具體的說明和代碼示例。

在直播錄制中比較關(guān)鍵的一步就是Render Callback Function。
iOS音頻采集過程中的音效實(shí)現(xiàn)
AudioUnit每次都是處理一段音頻數(shù)據(jù),每次處理完成一段數(shù)據(jù)的時(shí)候,這個(gè)回調(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è)置unit的屬性時(shí),需要注意的是一些公共的屬性。比如音頻格式屬性和MaximumFramesPerSlice。如果音頻格式設(shè)置錯(cuò)誤,往往會(huì)出現(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采集和播放,通常都是16KHz甚至更低。此時(shí)I/O Unit無法繼續(xù)使用之前的配置。需要按照實(shí)際支持的采樣率進(jìn)行配置。

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

  1. 使用AudioUnit進(jìn)行音效處理

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

4.1 混響效果(reverberation)

我們?cè)谝魳窂d,劇院,禮堂等比較空曠的室內(nèi)說話或唱歌時(shí),往往能聽到和平時(shí)不一樣的聲音,主要是聲音在墻壁上多次反射后疊加在一起,聽起來就有了混響的效果。在聲音處理中,我們可以人為的將聲音緩存起來,延時(shí)一定時(shí)間后,和原聲音疊加,就能夠模擬出混響的效果。AudioUnit提供了kAudioUnitSubType_Reverb2來實(shí)現(xiàn)混響效果的生成。將該unit接入到AUGraph中之后,配置參數(shù)即可實(shí)現(xiàn)混響的效果。雖然混響原理是比較簡(jiǎn)單,但實(shí)際上為了模擬自然界中實(shí)際的音效,計(jì)算過程還是相當(dāng)復(fù)雜的,要模擬出不同的大小的空間,不同材質(zhì)的墻壁,障礙物的多少,需要輸入比較多的參數(shù)來參與運(yùn)算。iOS的reverb unit提供了7個(gè)參數(shù)。我們?cè)谥辈?yīng)用中提供了4個(gè)不同場(chǎng)景的模擬(錄音棚,演唱會(huì),×××,小舞臺(tái)),主要是通過調(diào)整如下參數(shù)實(shí)現(xiàn)的:

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

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

4.2 變聲效果

變聲效果主要是在頻域上對(duì)人的聲音進(jìn)行一定的處理,我們知道男聲一般比較低沉,女聲比較尖銳,這個(gè)主要說的是音調(diào)。通過對(duì)聲音音調(diào)的調(diào)整,可以讓低沉的男聲聽上去像尖銳女聲。iOS提供了kAudioUnitSubType_NewTimePitch的unit來實(shí)現(xiàn)音調(diào)的調(diào)整。值得注意的是kAudioUnitSubType_NewTimePitch不是輸入Effect類的,而是屬于FormatConverter類的。通過設(shè)置TimePitch unit的kNewTimePitchParam_Pitch屬性即可。

/// pitchShift為具體數(shù)值(0表示不變,負(fù)數(shù)表明調(diào)低沉,正數(shù)調(diào)尖銳)AudioUnitSetParameter(pitchUnit, kNewTimePitchParam_Pitch, kAudioUnitScope_Global, 0, pitchShift, 0);

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

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

機(jī)器人音效,機(jī)器人的音效是一個(gè)組合效果,我們印象中的機(jī)器人音效都是老電影中的那種,音調(diào)比較高,而且有重音。所以我們采用的是TimePitch unit + Delay unit的方式。Delay unit也是iOS提供的一個(gè)將聲音延時(shí)疊加的unit,但是比混音要簡(jiǎn)單很多,只有單次疊加;

莊嚴(yán)宏大音效,想象一下佛祖之類的聲音,一般都是自帶回聲,而且比較男性化,所以我們選擇的是TimePitch unit + Reverb unit的方式來實(shí)現(xiàn)。

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

iOS音頻采集過程中的音效實(shí)現(xiàn)
圖3 voixal voice changer

  1. 總結(jié)

以上大概介紹了怎么用AudioUnit來實(shí)現(xiàn)iOS直播中的音頻采集,怎么使用AudioUnit中的音效組件來實(shí)現(xiàn)混響和變聲效果。但是AudioUnit的潛力還遠(yuǎn)沒有挖掘完,比如還可以將背景音樂播放,混音,回聲消除等其他移動(dòng)多媒體音頻相關(guān)的功能納入到這個(gè)框架中。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI