ios – 我想每秒调用20次installTapOnBus:bufferSize:format:block:

我想从麦克风实时输入波形显示.
我已经使用installTapOnBus:bufferSize:format:block:来实现,这个函数在一秒钟内被调用三次.
我想将此函数设置为每秒调用20次.
我在哪里可以设置?
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;
}

解决方法

他们说,Apple支持回复否:( 2014年9月)

Yes,currently internally we have a fixed tap buffer size (0.375s),
and the client specified buffer size for the tap is not taking effect.

但有人调整缓冲区大小,并获得40毫秒
https://devforums.apple.com/thread/249510?tstart=0

在ObjC中无法检查它:(

UPD它有效!只是单行:

[input installTapOnBus:0 bufferSize:1024 format:[mixer outputFormatForBus:0] block:^(AVAudioPCMBuffer *buffer,AVAudioTime *when) {
    buffer.frameLength = 1024; //here

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...