我想从麦克风实时输入波形显示。 我已经使用installTapOnBus实现了:bufferSize:format:block :,这个函数在一秒内被调用三次。 我想设置这个函数被称为每秒20次。 我可以在哪里设置?我想每秒调用20次installTapOnBus:bufferSize:format:block:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError* error = nil;
if (audioSession.isInputAvailable) [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if(error){
return;
}
[audioSession setActive:YES error:&error];
if(error){
retur;
}
self.engine = [[[AVAudioEngine alloc] init] autorelease];
AVAudioMixerNode* mixer = [self.engine mainMixerNode];
AVAudioInputNode* input = [self.engine inputNode];
[self.engine connect:input to:mixer format:[input inputFormatForBus:0]];
// tap ... 1 call in 16537Frames
// It does not change even if you change the bufferSize
[input installTapOnBus:0 bufferSize:4096 format:[input inputFormatForBus:0] block:^(AVAudioPCMBuffer* buffer, AVAudioTime* when) {
for (UInt32 i = 0; i < buffer.audioBufferList->mNumberBuffers; i++) {
Float32 *data = buffer.audioBufferList->mBuffers[i].mData;
UInt32 frames = buffer.audioBufferList->mBuffers[i].mDataByteSize/sizeof(Float32);
// create waveform
...
}
}];
[self.engine startAndReturnError:&error];
if (error) {
return;
}
谢谢你的答案。 我在等你的伟大代码! – Melodybox 2014-10-30 01:59:07
不幸的是,我的实验没有成功(在输入节点上安装呈现回调)。我的回调函数被调用,并且我得到了有效的缓冲区,但是所有的样本值都是0.假定输入节点有特殊行为阻止它的工作。很抱歉无法解决我们的问题,并使AVAudioEngine适合我们的用途。我将用旧的API来追求C++实现... – 2014-10-30 18:15:37
Melodybox,如果您希望为您的解决方案采用C/C++之路,请查看https://github.com/abbood/Learning-Core-Audio-Book-Code-Sample。这本书也很值得购买。不知道您是否在使用OS X或iOS,但是如果您在iOS上工作,请查看该存储库中的Chapter10_iOSPlayThrough项目。 – 2014-10-31 00:22:56