繁体   English   中英

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

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

音频记录按其应有的方式工作:我可以记录和播放记录。 唯一奇怪的是,有时会使用未完全填充的缓冲区来调用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 Core Audio缓冲区的处理。 这是因为由于应用程序无法控制的原因,iOS可以自由更改音频单元缓冲区的大小(例如,由于设备上运行的其他音频进程需要采样率重采样或由于设备的硬件功能,或者为了节省各种电量)模式等)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM