我下载了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
是什么导致这个问题。请帮帮我。
答案 0 :(得分:0)
在iOS中,音频会话setPreferredIOBufferDuration API(你甚至使用OS缓冲持续时间调用?)只是关于应用程序首选项的请求。操作系统可以自由选择不同的缓冲时长,但与iOS认为最佳(电池寿命,与其他应用的兼容性等)兼容。
音频队列运行在音频单元之上。如果RemoteIO音频单元使用500 mS缓冲区,它会将它们切换为4个较小的音频队列缓冲区,并将这些较小的缓冲区快速传输到音频队列API。
如果您使用Audio Unit API而不是Audio Queue API,以及setPreferredIOBufferDuration消息的Audio Session API,您可以请求并获得更短,更均匀间隔的音频缓冲区。