为什么我的iOS录音回调中的音频缓冲区未满



录音工作正常:我可以录制和播放录音。唯一奇怪的是,回调函数有时会被未完全填充的缓冲区调用。我已经在StreamCallback函数中记录了inNumPackets变量的值,序列可能如下所示:

2048,2048,2048

处理缓冲区的代码目前依赖于固定的大小,这意味着每次缓冲区未填充时我都会得到工件。

我能做点什么来总是得到充分的缓冲吗?-还是预期行为?

我的代码摘录如下:

DataFormat.mFormatID := kAudioFormatLinearPCM;
DataFormat.mSampleRate := 44100;
DataFormat.mChannelsPerFrame := 1;
DataFormat.mBitsPerChannel := 16;
DataFormat.mBytesPerPacket := 2;
DataFormat.mBytesPerFrame := 2;
DataFormat.mFramesPerPacket := 1;
DataFormat.mFormatFlags := kLinearPCMFormatFlagIsSignedInteger OR kLinearPCMFormatFlagIsPacked;
lStatus := AudioQueueNewInput(@DataFormat,@StreamCallback,nil,nil,kCFRunLoopCommonModes,0,fAqDataQueue);
...
//allocate 3 buffers with a buffer size of 2048 packets with 2 bytes per packet
AudioQueueAllocateBuffer(fAqDataQueue,2*2048,fAqDataBuffers[li]);

您不能使用依赖于固定大小的iOS核心音频缓冲区的处理。这是因为iOS可以自由更改音频单元缓冲区大小,原因超出了您的应用程序的控制范围(例如,设备上运行的其他音频进程所需的采样率重新采样,或设备的硬件功能,或各种省电模式等)

如果您需要处理固定大小的缓冲区,请对传入的音频单元样本使用无锁循环FIFO/缓冲区,并轮询该FIFO,看看它是否包含足够的样本用于您的处理步骤。有关详细信息,请参阅此答案。

最新更新