当我重新定义回调函数的时间间隔时,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 消息,您可以请求并缩短,间隔更均匀的音频缓冲区。
我下载了 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 消息,您可以请求并缩短,间隔更均匀的音频缓冲区。