IOS音频编程之变声处理
需求:耳塞Mic实时录音,变声处理后实时输出
初始化
程序使用44100HZ的频率对原始的音频数据进行采样,并在音频输入的回调中处理采样的数据。
1)对AVAudioSession的一些设置
NSError *error;
self.session = [AVAudioSession sharedInstance];
[self.session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
handleError(error);
//route变化监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionRouteChangeHandle:) name:AVAudioSessionRouteChangeNotification object:self.session];
[self.session setPreferredIOBufferDuration:0.005 error:&error];
handleError(error);
[self.session setPreferredSampleRate:kSmaple error:&error];
handleError(error);
[self.session setActive:YES error:&error];
handleError(error);
setPreferredIOBufferDurations
文档上解释change to the I/O buffer duration
,具体解释参看官方文档。我把它理解为在每次调用输入或输出的回调,能提供多长时间(由设置的这个值决定)的音频数据。但当我用0.005和0.93分别设置它的时候,发现回调中的inNumberFrames
的值并未改变,一直是512,相当于每次输入或输出提供了512/44100=0.0116s的数据。(设置有问题?)
setPreferredSampleRate
设置对音频数据的采样率。
2)获取AudioComponentInstance
//Obtain a RemoteIO unit instance
AudioComponentDescription acd;
acd.componentType = kAudioUnitType_Output;
acd.componentSubType = kAudioUnitSubType_RemoteIO;
acd.componentFlags = 0;
acd.componentFlagsMask = 0;
acd.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent inputComponent = AudioComponentFindNext(NULL, &acd);
AudioComponentInstanceNew(inputComponent, &_toneUnit);
3)对AudioComponentInstance的一些初始化设置

这张图蓝色框中的部分就是一个
I/O Unit
(
AudioComponentInstance
的实例).图中的
Element 0
连接
Speaker
,也叫
Output Bus
;
Element 1
连接
Mic
,也叫
Input