随着KTV遍布中国的大街小巷,唱歌俨然成为人们日常娱乐必不可或缺的一部分.哪怕你原本的歌声不够动人,在经过了混响的二次合成之后,也会变得增色不少,iOS提供了不少API可以使用,而今天就和大家分享一个最常用的音效之 --- 混响
理论部分
通过创建AVAudioEngine
类,就好比火车一样,作为火车头连接一个一个的节点音效,最后输出
大概如下面的流程
<pre>
输入 -> 音效处理 -> 输出
</pre>
也正是因为这个流程,可以让我们在播放的时候自由进行音效处理,而不用在播放前便已写死.
具体流程
1.首先我们先对session进行一些操作
[sessionInstance setCategory:AVAudioSessionCategoryPlayback error:&error];
[sessionInstance setPreferredSampleRate:hwSampleRate error:&error];
[sessionInstance setPreferredIOBufferDuration:ioBufferDuration error:&error]; [sessionInstance setActive:YES error:&error];
2.接着对PlayerNode和音效进行初始化操作
_player = [[AVAudioPlayerNode alloc]init];
_reverb = [[AVAudioUnitReverb alloc] init];
3.创建AudioFile和缓冲区
AVAudioFile *file = [[AVAudioFile alloc]initForReading:self.fileURL error:&error];
_playerLoopBuffer = [[AVAudioPCMBuffer alloc]initWithPCMFormat:[file processingFormat] frameCapacity:(AVAudioFrameCount)[file length]];
[file readIntoBuffer:_playerLoopBuffer error:&error];
4.创建节点并加入节点
_engine = [[AVAudioEngine alloc] init];
[_engine attachNode:_reverb];
[_engine attachNode:_player];
5.格式化并连接节点
AVAudioMixerNode *mainMixer = [_engine mainMixerNode];
AVAudioFormat *stereoFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100 channels:2];
// establish a connection between nodes
// connect the player to the reverb
[_engine connect:_player to:_reverb format:stereoFormat];
// connect the reverb effect to mixer input bus 0
[_engine connect:_reverb to:mainMixer fromBus:0 toBus:0 format:stereoFormat];
6.设置音效
这里的混响效果有12种不同的效果可以设置,干湿比在0-100之间
[_reverb loadFactoryPreset:AVAudioUnitReverbPresetMediumHall];
_reverb.wetDryMix = 0;
7.最后启动我们的声效
NSError *error;
[_engine startAndReturnError:&error];
当上面的都设置完成之后我们就可以开始播放(zhuang bi)了
[_player scheduleBuffer:_playerLoopBuffer atTime:nil options:AVAudioPlayerNodeBufferLoops completionHandler:nil];
[_player play];
Demo地址:https://github.com/WeiTChen/AudioMixt
参考资料
AVAudioEngine苹果官方Demo:
https://developer.apple.com/library/ios/samplecode/AVAEMixerSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40015134
写在最后
由于网上的参考资料几乎一片空白,代码也都是从苹果官方Demo中修改分析所得,可能理论部分难免有所误差.如有发现欢迎指正,共同进步!
原创作品,转载请注明出处.