为什么音频缓冲器在我的iOS录音回调中没有充满?

时间:2016-03-23 10:32:08

标签: ios core-audio 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]);

1 个答案:

答案 0 :(得分:2)

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

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