当我重新定义回调函数的时间间隔时,speakhere 示例无法正常工作

speakhere sample can not work correctly when I redefine the time interval of callback function

我下载了 speakHere 示例并更改了如下参数:

#define kBufferDurationSeconds  0.020

void AQRecorder::SetupAudioFormat(UInt32 inFormatID)
{
   memset(&mRecordFormat,0, sizeof(mRecordFormat));
   mRecordFormat.mFormatID =kAudioFormatLinearPCM;
   mRecordFormat.mSampleRate =8000.0; 
   mRecordFormat.mFormatFlags =kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
   mRecordFormat.mBitsPerChannel = 16;
   mRecordFormat.mFramesPerPacket  = mRecordFormat.mChannelsPerFrame =1;
   mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel/8) *      mRecordFormat.mChannelsPerFrame;
   mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame ;
}

但是我发现好像回调函数的时间间隔AQRecorder::MyInputBufferHandler()被调用了,但不是每20ms调用一次。它以 1ms 的间隔调用回调函数四次,在 500ms 之后调用回调函数一次,然后以 1ms 调用四次,然后 500ms,一遍又一遍。但是我设置了参数kBufferDurationSeconds = 0.02 是什么导致了这个问题。请帮助我。

在 iOS 中,音频会话 setPreferredIOBufferDuration API(您甚至使用了 OS 缓冲持续时间调用吗?)只是关于应用程序首选项的请求。 OS 可以自由选择不同的缓冲持续时间,但与 iOS 认为最好的兼容(电池寿命、与其他应用程序的兼容性等)

音频队列 运行 在音频单元之上。如果 RemoteIO 音频单元使用 500 毫秒缓冲区,它将把它们分成 4 个较小的音频队列缓冲区,然后将这些较小的缓冲区快速传递到音频队列 API。

如果您使用音频单元 API 而不是音频队列 API,并且音频会话 API 用于 setPreferredIOBufferDuration 消息,您可以请求并缩短,间隔更均匀的音频缓冲区。