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

时间:2015-07-30 03:33:22

标签: ios iphone audio core-audio avaudioplayer

我下载了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后调用回调函数一次,然后调用4ms,1ms,然后500ms,一遍又一遍。但我设置参数kBufferDurationSeconds = 0.02 是什么导致这个问题。请帮帮我。

1 个答案:

答案 0 :(得分:0)

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

音频队列运行在音频单元之上。如果RemoteIO音频单元使用500 mS缓冲区,它会将它们切换为4个较小的音频队列缓冲区,并将这些较小的缓冲区快速传输到音频队列API。

如果您使用Audio Unit API而不是Audio Queue API,以及setPreferredIOBufferDuration消息的Audio Session API,您可以请求并获得更短,更均匀间隔的音频缓冲区。