AVFoundation连续系列之四添加音效
这一部分我觉得是咱们这一系列中比较有意思的地方,如果你再懂一些音乐,会更好玩一些。这季咱们讲音效-AVAudioUnitEffect。
一.简介
咱们上节课介绍了下非常重要的一个东西,叫做节点。其中有一个节点叫做AudioUnit,它是咱们音频的单元,在音频单元的下边又有一个分支,叫做AudioUnitEffect,效果单元。这个效果单元下面又划分出四个分支,分别是四种音效,或者咱们直接把他看成是咱们的效果器,(效果器就是你去KTV里面唱歌,你的声音从话筒进去,经过一个给你声音添加效果的硬件,哪些硬件就是咱们的效果器)如图:
咱们分别看下这四种音效:
1.AVAudioUnitReverb:混响,混响可以模拟咱们在一个空旷的环境,比如教堂、大房间等,这样咱们在说话的时候,就会有回音,并且声音也比较有立体感。
混响里面又给咱们区分了下具体的效果,咱们可以见识下:
publicenumAVAudioUnitReverbPreset :Int{
caseSmallRoom 小房间
caseMediumRoom 中等房间
caseLargeRoom 大房间
caseMediumHall 中等大厦
caseLargeHall 大型的大厦
casePlate 光面墙
caseMediumChamber 中等会议厅
caseLargeChamber 大型会议厅
caseCathedral 教堂
caseLargeRoom2 大型房间2
caseMediumHall2 中等大厦2
caseMediumHall3 中等大厦3
caseLargeHall2 大型大厦2
}
这些效果 自己都可以去试一下,体验下每一种效果的不同,当然你还可以去调节它里面一些细微的参数。
2.AVAudioUnitEQ:均衡器,咱们可以使用均衡器来调节咱们音频的各个频段,比如,我想让我的低音更加浑厚,我就可以调节EQ的20-150HZ的频段,如果你想让你的声音更加明亮,那可以调节500-1KHZ的频段,我说的这些都是一些笼统的范围值,具体的可以去查阅一些均衡器设置的教程,这里一定要注意,在设置不同乐器、不同人声、或者环境音的时候,咱们的均衡器调节也是不一样的,一定要根据你的需求去调节。
值得庆幸的是,苹果也提供给了咱们bands,在这个所谓的乐队里面,咱们可以选择一些预设的效果,如下:
publicenumAVAudioUnitEQFilterType :Int{
caseParametric 参量均衡器 可以通过设置一些参量,来调节咱们均衡器的频点
caseLowPass 低通滤波器 衰弱高频
caseHighPass 高通滤波器 衰弱低频
caseResonantLowPass 可以引发共鸣的 低通滤波器
caseResonantHighPass 可以引发共鸣的 高通滤波器
caseBandPass 带通滤波器 提升某一频率附近的信号 忽略过高 或 过低的 部分
caseBandStop 与上面的相反 忽略某一频率附近的信号
caseLowShelf 低架 降低整体
caseHighShelf 高架 提升整体
caseResonantLowShelf 可以引发共鸣的 低架
caseResonantHighShelf可以引发共鸣的 高架
}
当然,你也可以调节一些细微的参数。
3.AVAudioUnitDistortion:失真,玩过电吉他的同学,这个肯定不会陌生,哪怕你仅仅是刚刚接触的。失真是可以把声音变得沙哑的效果器。失真效果器也有很多很多种,咱们直接看下苹果给咱们预设的吧:
publicenumAVAudioUnitDistortionPreset :Int{
caseDrumsBitBrush 轻微的小鼓刷
caseDrumsBufferBeats 鼓点
caseDrumsLoFi 低保真
caseMultiBrokenSpeaker 多通道 破裂的嗓音
caseMultiCellphoneConcert 老式电话机的声音
caseMultiDecimated1 削波失真
caseMultiDecimated2 削波失真
caseMultiDecimated3 削波失真
caseMultiDecimated4 削波失真
caseMultiDistortedFunk 扭曲的funk效果失真
caseMultiDistortedCubed 扭曲的立方体效果
caseMultiDistortedSquared 扭曲的正方体效果
caseMultiEcho1 回声
caseMultiEcho2 回声
caseMultiEchoTight1 紧密的回声
caseMultiEchoTight2 紧密的回声
caseMultiEverythingIsBroken 破碎的失真
caseSpeechAlienChatter 外星人喋喋不休的声音
caseSpeechCosmicInterference 宇宙电子干扰的声音
caseSpeechGoldenPi 金属声音
caseSpeechRadioTower 收音机的声音
caseSpeechWaves 波形的声音
}
这些失真解释起来可真是费劲,官网没任何提示,只能依靠我对效果器的一点点认识猜测推断的,不过最终知道中文翻译也没多大的用处,还是需要真实的去使用才可以真正去理解的。
4.AVAudioUnitDelay:延迟,延迟就是 发出一个声音之后,过段时间再次发出,一直衰减到听不见。类似咱们的回声。可以通过里面的属性去细微的调节延迟的时间、速度等。
二.使用
估计很多同学都迫不及待的想来体验一把了,在咱们体验这些效果器之前,再次把咱们讲音频引擎时候的一张图片拿过来再次看下:
通过这张图,咱们可以看出,咱们音频的一个执行流程:
input(Mic或者音频文件) ->效果器->output
如果有多个效果器呢?
那就继续在效果器那一部分继续添加:
input(Mic或者音频文件) ->效果器1->效果器2->output
咱们在编程的时候,也是一样这个流程的,只不过,咱们多了一个音频引擎来控制整个流程。
咱们上节课还讲到节点的概念,每一个在音频引擎中的元素都是一个音频节点,这些节点都需要附着到咱们的音频引擎上,才可以去连接这些节点,实现音频整个流程的贯穿。最后开启引擎。
好了,咱们知道流程是什么样的了,咱们写一个实时给拾取的音频添加音效的例子吧!
//创建音频引擎
lazyvarengine =AVAudioEngine()
//创建混响效果
lazyvarreverb =AVAudioUnitReverb()
overridefuncviewDidLoad() {
super.viewDidLoad()
//音频输入口
letintput =engine.inputNode!
//音频输出口
letoutput =engine.outputNode
//设置混响效果器为教堂的效果
reverb.loadFactoryPreset(.Cathedral)
//设置混响的干湿比是从0-100的值干湿比影响到咱们混响与原声的一个混合比例
reverb.wetDryMix=30
//把混响附着到音频引擎
engine.attachNode(reverb)
//使用音频引擎连接各个节点
// 1.输入口连接效果器可对比咱们的图来看
// Format:格式是咱们输入口在主线的一个格式
engine.connect(intput, to:reverb, format: intput.inputFormatForBus(0))
// 2.效果器连接输出口
engine.connect(reverb, to: output, format: intput.inputFormatForBus(0))
//所有节点都连接好了,那咱们可以开启引擎,享受咱们的效果器了
try!engine.start()
}
接下来咱们再看个EQ的案例:
letintput =engine.inputNode!
letoutput =engine.outputNode
//创建设置只有一组EQ
leteq =AVAudioUnitEQ.init(numberOfBands:1)
//获得EQ效果的参数
letfiler = eq.bands.first
//设置低通效果
filer?.filterType= .LowPass
//设置频宽
filer?.bandwidth=10
//设置增益
filer?.gain=20
//将EQ附着到音频引擎
engine.attachNode(eq)
//开始连接各个节点
engine.connect(intput, to: eq, format: intput.inputFormatForBus(0))
engine.connect(eq, to: output, format: intput.inputFormatForBus(0))
//开启引擎
try!engine.start()
}
关于失真的案例:
importAVFoundation
classViewController:UIViewController{
lazyvarengine =AVAudioEngine()
overridefuncviewDidLoad() {
super.viewDidLoad()
letintput =engine.inputNode!
letoutput =engine.outputNode
//创建设置失真
letdistortion =AVAudioUnitDistortion()
distortion.loadFactoryPreset(.SpeechRadioTower)
distortion.preGain=4
distortion.wetDryMix=80
//将distortion附着到音频引擎
engine.attachNode(distortion)
//开始连接各个节点
engine.connect(intput, to: distortion, format: intput.inputFormatForBus(0))
engine.connect(distortion, to: output, format: intput.inputFormatForBus(0))
//开启引擎
try!engine.start()
}
关于延迟的案例:
lazyvarengine =AVAudioEngine()
overridefuncviewDidLoad() {
super.viewDidLoad()
letintput =engine.inputNode!
letoutput =engine.outputNode
//创建设置延迟
letdalay =AVAudioUnitDelay()
//延迟时间的范围是0-2秒默认值是1
dalay.delayTime=0.5
//延迟的反馈值范围-100到100默认值50直接影响到咱们回音的时长
dalay.feedback=20
dalay.wetDryMix=80
//将distortion附着到音频引擎
engine.attachNode(dalay)
//开始连接各个节点
engine.connect(intput, to: dalay, format: intput.inputFormatForBus(0))
engine.connect(dalay, to: output, format: intput.inputFormatForBus(0))
//开启引擎
try!engine.start()
}
关于连接多个效果器的案例:
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()
//设置混响效果器为教堂的效果
reverb.loadFactoryPreset(.LargeRoom)
//设置混响的干湿比是从0-100的值干湿比影响到咱们混响与原声的一个混合比例
reverb.wetDryMix=40
//把混响附着到音频引擎
engine.attachNode(reverb)
//开始连接各个节点
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))
//开启引擎
try!engine.start()
}
好了,咱们的音效就到这里吧,估计实时音效应该都会玩了。代码在这里: