音频记录按其应有的方式工作:我可以记录和播放该记录。唯一奇怪的是,有时会使用未完全填充的缓冲区来调用Callback函数。我已经inNumPackets
在StreamCallback函数中记录了variable的值,并且序列看起来可能像这样:
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 Core Audio缓冲区的处理。这是因为,由于应用程序无法控制的原因,iOS可以自由更改音频单元缓冲区的大小(例如,设备上运行的其他音频进程需要采样率重采样,或者设备的硬件功能,或者可以节省各种电量)模式等)
如果需要处理固定大小的缓冲区,请对输入的音频单元样本使用无锁循环FIFO /缓冲区,并轮询该FIFO以查看其是否包含足够的样本用于您的处理步骤。有关更多详细信息,请参见此答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句