音频队列以 8 KHz 录制,不每 20 毫秒调用一次回调



iOS 10+ iPhone:5s和6 Xcode: 9+

我正在使用aLaw编解码器以 8KHz采样率录制音频,样本大小为8 位。我创建了一个这样的音频队列:

// create the queue
XThrowIfError(AudioQueueNewInput(
&mRecordFormat,
MyInputBufferHandler,
this /* userData */,
NULL /* run loop */,
kCFRunLoopCommonModes /* run loop mode */,
0 /* flags */,
&mQueue), "AudioQueueNewInput failed");

MyInputBufferHandler 是每次填充缓冲区(每 20 毫秒 160 个字节(时调用的回调。所以我希望回调每 20 毫秒调用一次。但是在测试它时,每 128 毫秒,MyInputBufferHandler 回调会在突发中调用 6 次。 虽然我希望每 20 毫秒调用一次回调。 我的录制配置为:

mRecordFormat.mSampleRate = 8000.0; // 8 KHz
mRecordFormat.mChannelsPerFrame = 1;
mRecordFormat.mBytesPerFrame = 1;
mRecordFormat.mBitsPerChannel = 8;
mRecordFormat.mBytesPerPacket = 1;
mRecordFormat.mFramesPerPacket = 1;

有人可以帮我吗?为什么每 128 毫秒而不是 20 毫秒调用一次 MyInputBufferHandler?采样率为 8 KHz,缓冲为 160 字节的记录,意味着每 20 毫秒调用 MyInputBufferHandler,而不是每 128 毫秒!

似乎 AudioQueue位于 AudioUnit 之上,无论您在 AudioQueue 级别设置什么缓冲区大小,都无法控制内部缓冲区大小。因此,默认情况下,内部缓冲区至少设置为 1024 字节。因此,如果您想在 160 字节的记录数据后进行回调,则不会。

因此,对于那些遇到相同问题的人,您需要使用AudioUnit。

类似情况的链接: https://stackoverflow.com/a/4597409/1012775 https://stackoverflow.com/a/6687050/1012775

最新更新