AVFoundation連續(xù)系列之四添加音效

AVFoundation連續(xù)系列之四添加音效

這一部分我覺(jué)得是咱們這一系列中比較有意思的地方,如果你再懂一些音樂(lè),會(huì)更好玩一些。這季咱們講音效-AVAudioUnitEffect。

一.簡(jiǎn)介

咱們上節(jié)課介紹了下非常重要的一個(gè)東西,叫做節(jié)點(diǎn)。其中有一個(gè)節(jié)點(diǎn)叫做AudioUnit,它是咱們音頻的單元,在音頻單元的下邊又有一個(gè)分支,叫做AudioUnitEffect,效果單元。這個(gè)效果單元下面又劃分出四個(gè)分支,分別是四種音效,或者咱們直接把他看成是咱們的效果器,(效果器就是你去KTV里面唱歌,你的聲音從話筒進(jìn)去,經(jīng)過(guò)一個(gè)給你聲音添加效果的硬件,哪些硬件就是咱們的效果器)如圖:


咱們分別看下這四種音效:

1.AVAudioUnitReverb:混響,混響可以模擬咱們?cè)谝粋€(gè)空曠的環(huán)境,比如教堂、大房間等,這樣咱們?cè)谡f(shuō)話的時(shí)候,就會(huì)有回音,并且聲音也比較有立體感。

混響里面又給咱們區(qū)分了下具體的效果,咱們可以見(jiàn)識(shí)下:

publicenumAVAudioUnitReverbPreset :Int{

caseSmallRoom 小房間

caseMediumRoom 中等房間

caseLargeRoom 大房間

caseMediumHall 中等大廈

caseLargeHall 大型的大廈

casePlate 光面墻

caseMediumChamber 中等會(huì)議廳

caseLargeChamber 大型會(huì)議廳

caseCathedral 教堂

caseLargeRoom2 大型房間2

caseMediumHall2 中等大廈2

caseMediumHall3 中等大廈3

caseLargeHall2 大型大廈2

}

這些效果 自己都可以去試一下,體驗(yàn)下每一種效果的不同,當(dāng)然你還可以去調(diào)節(jié)它里面一些細(xì)微的參數(shù)。

2.AVAudioUnitEQ:均衡器,咱們可以使用均衡器來(lái)調(diào)節(jié)咱們音頻的各個(gè)頻段,比如,我想讓我的低音更加渾厚,我就可以調(diào)節(jié)EQ的20-150HZ的頻段,如果你想讓你的聲音更加明亮,那可以調(diào)節(jié)500-1KHZ的頻段,我說(shuō)的這些都是一些籠統(tǒng)的范圍值,具體的可以去查閱一些均衡器設(shè)置的教程,這里一定要注意,在設(shè)置不同樂(lè)器、不同人聲、或者環(huán)境音的時(shí)候,咱們的均衡器調(diào)節(jié)也是不一樣的,一定要根據(jù)你的需求去調(diào)節(jié)。

值得慶幸的是,蘋(píng)果也提供給了咱們bands,在這個(gè)所謂的樂(lè)隊(duì)里面,咱們可以選擇一些預(yù)設(shè)的效果,如下:

publicenumAVAudioUnitEQFilterType :Int{

caseParametric 參量均衡器 可以通過(guò)設(shè)置一些參量,來(lái)調(diào)節(jié)咱們均衡器的頻點(diǎn)

caseLowPass 低通濾波器 衰弱高頻

caseHighPass 高通濾波器 衰弱低頻

caseResonantLowPass ?可以引發(fā)共鳴的?低通濾波器

caseResonantHighPass?可以引發(fā)共鳴的 ?高通濾波器

caseBandPass 帶通濾波器 ?提升某一頻率附近的信號(hào) 忽略過(guò)高 或 過(guò)低的 部分

caseBandStop 與上面的相反 ?忽略某一頻率附近的信號(hào)

caseLowShelf 低架 降低整體

caseHighShelf 高架 提升整體

caseResonantLowShelf ?可以引發(fā)共鳴的 低架

caseResonantHighShelf可以引發(fā)共鳴的 高架

}

當(dāng)然,你也可以調(diào)節(jié)一些細(xì)微的參數(shù)。

3.AVAudioUnitDistortion:失真,玩過(guò)電吉他的同學(xué),這個(gè)肯定不會(huì)陌生,哪怕你僅僅是剛剛接觸的。失真是可以把聲音變得沙啞的效果器。失真效果器也有很多很多種,咱們直接看下蘋(píng)果給咱們預(yù)設(shè)的吧:

publicenumAVAudioUnitDistortionPreset :Int{

caseDrumsBitBrush 輕微的小鼓刷

caseDrumsBufferBeats 鼓點(diǎn)

caseDrumsLoFi 低保真

caseMultiBrokenSpeaker 多通道 破裂的嗓音

caseMultiCellphoneConcert 老式電話機(jī)的聲音

caseMultiDecimated1 削波失真

caseMultiDecimated2 削波失真

caseMultiDecimated3 削波失真

caseMultiDecimated4?削波失真

caseMultiDistortedFunk ?扭曲的funk效果失真

caseMultiDistortedCubed 扭曲的立方體效果

caseMultiDistortedSquared?扭曲的正方體效果

caseMultiEcho1 回聲

caseMultiEcho2? 回聲

caseMultiEchoTight1 緊密的回聲

caseMultiEchoTight2?緊密的回聲

caseMultiEverythingIsBroken 破碎的失真

caseSpeechAlienChatter 外星人喋喋不休的聲音

caseSpeechCosmicInterference 宇宙電子干擾的聲音

caseSpeechGoldenPi 金屬聲音

caseSpeechRadioTower 收音機(jī)的聲音

caseSpeechWaves 波形的聲音

}

這些失真解釋起來(lái)可真是費(fèi)勁,官網(wǎng)沒(méi)任何提示,只能依靠我對(duì)效果器的一點(diǎn)點(diǎn)認(rèn)識(shí)猜測(cè)推斷的,不過(guò)最終知道中文翻譯也沒(méi)多大的用處,還是需要真實(shí)的去使用才可以真正去理解的。

4.AVAudioUnitDelay:延遲,延遲就是 發(fā)出一個(gè)聲音之后,過(guò)段時(shí)間再次發(fā)出,一直衰減到聽(tīng)不見(jiàn)。類(lèi)似咱們的回聲。可以通過(guò)里面的屬性去細(xì)微的調(diào)節(jié)延遲的時(shí)間、速度等。

二.使用

估計(jì)很多同學(xué)都迫不及待的想來(lái)體驗(yàn)一把了,在咱們體驗(yàn)這些效果器之前,再次把咱們講音頻引擎時(shí)候的一張圖片拿過(guò)來(lái)再次看下:


通過(guò)這張圖,咱們可以看出,咱們音頻的一個(gè)執(zhí)行流程:

input(Mic或者音頻文件) ->效果器->output

如果有多個(gè)效果器呢?

那就繼續(xù)在效果器那一部分繼續(xù)添加:

input(Mic或者音頻文件) ->效果器1->效果器2->output

咱們?cè)诰幊痰臅r(shí)候,也是一樣這個(gè)流程的,只不過(guò),咱們多了一個(gè)音頻引擎來(lái)控制整個(gè)流程。

咱們上節(jié)課還講到節(jié)點(diǎn)的概念,每一個(gè)在音頻引擎中的元素都是一個(gè)音頻節(jié)點(diǎn),這些節(jié)點(diǎn)都需要附著到咱們的音頻引擎上,才可以去連接這些節(jié)點(diǎn),實(shí)現(xiàn)音頻整個(gè)流程的貫穿。最后開(kāi)啟引擎。

好了,咱們知道流程是什么樣的了,咱們寫(xiě)一個(gè)實(shí)時(shí)給拾取的音頻添加音效的例子吧!

//創(chuàng)建音頻引擎

lazyvarengine =AVAudioEngine()

//創(chuàng)建混響效果

lazyvarreverb =AVAudioUnitReverb()

overridefuncviewDidLoad() {

super.viewDidLoad()

//音頻輸入口

letintput =engine.inputNode!

//音頻輸出口

letoutput =engine.outputNode

//設(shè)置混響效果器為教堂的效果

reverb.loadFactoryPreset(.Cathedral)

//設(shè)置混響的干濕比是從0-100的值干濕比影響到咱們混響與原聲的一個(gè)混合比例

reverb.wetDryMix=30

//把混響附著到音頻引擎

engine.attachNode(reverb)

//使用音頻引擎連接各個(gè)節(jié)點(diǎn)

//??????? 1.輸入口連接效果器可對(duì)比咱們的圖來(lái)看

//??????? Format:格式是咱們輸入口在主線的一個(gè)格式

engine.connect(intput, to:reverb, format: intput.inputFormatForBus(0))

//??????? 2.效果器連接輸出口

engine.connect(reverb, to: output, format: intput.inputFormatForBus(0))

//所有節(jié)點(diǎn)都連接好了,那咱們可以開(kāi)啟引擎,享受咱們的效果器了

try!engine.start()

}

接下來(lái)咱們?cè)倏磦€(gè)EQ的案例:

letintput =engine.inputNode!

letoutput =engine.outputNode

//創(chuàng)建設(shè)置只有一組EQ

leteq =AVAudioUnitEQ.init(numberOfBands:1)

//獲得EQ效果的參數(shù)

letfiler = eq.bands.first

//設(shè)置低通效果

filer?.filterType= .LowPass

//設(shè)置頻寬

filer?.bandwidth=10

//設(shè)置增益

filer?.gain=20

//將EQ附著到音頻引擎

engine.attachNode(eq)

//開(kāi)始連接各個(gè)節(jié)點(diǎn)

engine.connect(intput, to: eq, format: intput.inputFormatForBus(0))

engine.connect(eq, to: output, format: intput.inputFormatForBus(0))

//開(kāi)啟引擎

try!engine.start()

}

關(guān)于失真的案例:

importAVFoundation

classViewController:UIViewController{

lazyvarengine =AVAudioEngine()

overridefuncviewDidLoad() {

super.viewDidLoad()

letintput =engine.inputNode!

letoutput =engine.outputNode

//創(chuàng)建設(shè)置失真

letdistortion =AVAudioUnitDistortion()

distortion.loadFactoryPreset(.SpeechRadioTower)

distortion.preGain=4

distortion.wetDryMix=80

//將distortion附著到音頻引擎

engine.attachNode(distortion)

//開(kāi)始連接各個(gè)節(jié)點(diǎn)

engine.connect(intput, to: distortion, format: intput.inputFormatForBus(0))

engine.connect(distortion, to: output, format: intput.inputFormatForBus(0))

//開(kāi)啟引擎

try!engine.start()

}

關(guān)于延遲的案例:

lazyvarengine =AVAudioEngine()

overridefuncviewDidLoad() {

super.viewDidLoad()

letintput =engine.inputNode!

letoutput =engine.outputNode

//創(chuàng)建設(shè)置延遲

letdalay =AVAudioUnitDelay()

//延遲時(shí)間的范圍是0-2秒默認(rèn)值是1

dalay.delayTime=0.5

//延遲的反饋值范圍-100到100默認(rèn)值50直接影響到咱們回音的時(shí)長(zhǎng)

dalay.feedback=20

dalay.wetDryMix=80

//將distortion附著到音頻引擎

engine.attachNode(dalay)

//開(kāi)始連接各個(gè)節(jié)點(diǎn)

engine.connect(intput, to: dalay, format: intput.inputFormatForBus(0))

engine.connect(dalay, to: output, format: intput.inputFormatForBus(0))

//開(kāi)啟引擎

try!engine.start()

}

關(guān)于連接多個(gè)效果器的案例:

lazyvarengine =AVAudioEngine()

overridefuncviewDidLoad() {

super.viewDidLoad()

letintput =engine.inputNode!

letoutput =engine.outputNode

letdistortion =AVAudioUnitDistortion()

distortion.loadFactoryPreset(.SpeechGoldenPi)

distortion.preGain=1

distortion.wetDryMix=40

//將distortion附著到音頻引擎

engine.attachNode(distortion)

letreverb =AVAudioUnitReverb()

//設(shè)置混響效果器為教堂的效果

reverb.loadFactoryPreset(.LargeRoom)

//設(shè)置混響的干濕比是從0-100的值干濕比影響到咱們混響與原聲的一個(gè)混合比例

reverb.wetDryMix=40

//把混響附著到音頻引擎

engine.attachNode(reverb)

//開(kāi)始連接各個(gè)節(jié)點(diǎn)

engine.connect(intput, to: distortion, format: intput.inputFormatForBus(0))

engine.connect(distortion, to: reverb, format: intput.inputFormatForBus(0))

engine.connect(reverb, to: output, format: intput.inputFormatForBus(0))

//開(kāi)啟引擎

try!engine.start()

}

好了,咱們的音效就到這里吧,估計(jì)實(shí)時(shí)音效應(yīng)該都會(huì)玩了。代碼在這里:

Reverb

EQ

Distortion

Delay

多種效果器的混合使用


最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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