iOS混响效果初探

作者: 魏天晨 | 来源:发表于2016-07-21 16:02 被阅读1280次

随着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中修改分析所得,可能理论部分难免有所误差.如有发现欢迎指正,共同进步!


原创作品,转载请注明出处.

相关文章

网友评论

  • yadong:请问 AVAudioPlayerNode 可以记录当前音乐播放的时间和音乐的总时长吗?
  • hutuyingxiong:麦克风采集的 pcm 数据怎么实现混响效果呢?向大神请教下,谢谢!
  • 飞鱼非鱼会飞:知道其中的bus有什么用吗?
    飞鱼非鱼会飞:@魏天晨 好像是的:metal:
    魏天晨:好久没看了,如果我没记错,bus是通道的意思,比如你在通道一放架子鼓,通道2放钢琴.以此类推,可以组成完整的伴奏
  • 谢衣丶:请教 AVAudioPlayerNode 可以从指定位置开始播放吗 类似快进功能..
    魏天晨:@谢衣丶 可以,他有一个API是`playAtTime`,可以通过这个来设置

本文标题:iOS混响效果初探

本文链接:https://www.haomeiwen.com/subject/flpbjttx.html