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

Why is the audiobuffer not full in my iOS audio recording callback?

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

2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 1568, 2048, 2048, 2048, 2048, 2048, 2048, 2048 , 2048, 2048, 2010, 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/buffer,并轮询该 FIFO 以查看它是否包含足够的样本供您的处理步骤使用。有关详细信息,请参阅 this answer