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

汉斯

音频记录按其应有的方式工作:我可以记录和播放该记录。唯一奇怪的是,有时会使用未完全填充的缓冲区来调用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]);
hotpaw2

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

在异步回调中从 NetworkStream 读取缓冲区

为什么位缓冲区和缓冲区给我不同的输出?

为什么我没有缓冲区溢出?

为什么我不能写这个缓冲区?

为什么我的频道需要缓冲区?

为什么我的常量缓冲区没有更新?

在ObjectiveC中串联音频缓冲区

为什么在iOS 13中将Yp Cb Cr图像缓冲区全部改组?

为什么此代码中的缓冲区溢出行为与我预期的不同?

为什么我的缓冲区存储在堆栈中的两个位置?

为什么我的代码不后退并将输入保留在缓冲区中?

为什么在Javascript中绝不转移缓冲区?

为什么sscanf将\ n存储在缓冲区中

为什么虽然我在finally块中释放了缓冲区,但为什么仍然得到netty.util.ResourceLeakDetector?

为什么 SDL2 提供的缓冲区,对于音频样本,不够大?

为什么缓冲区大小会影响音频数据?

在iOS音频通话APP中使用循环缓冲区的原因是什么?

为什么在C#7.2的结构中不能同时使用只读缓冲区和固定大小缓冲区

C / C ++中难以理解的语法!!为什么我们可以这样分配缓冲区?

Pytorch中的缓冲区是什么?

在ffmpeg中限制音频缓冲区的大小,例如ShadowPlay

在javascript中对PCM音频缓冲区进行下采样

为什么我的Disruptor程序没有充分利用环形缓冲区

为什么我的opengl场景有深度缓冲区问题?

信号量并发限制,为什么我必须先释放缓冲区?

为什么我在缓冲区上的 Javascript 视图全为零?

为什么scanf()似乎加载的地址低于我正在写入的缓冲区的地址?

为什么我的源产生的结果超出缓冲区大小?