录制音频时 AudioQueueServices 回调的意外行为

Posted

技术标签:

【中文标题】录制音频时 AudioQueueServices 回调的意外行为【英文标题】:Unexpected behavior with AudioQueueServices callback while recording audio 【发布时间】:2010-03-26 04:23:45 【问题描述】:

我正在使用 AudioQueueServices 录制连续的数据流。据我了解,只有当缓冲区充满数据时才会调用回调。在实践中,第一个回调有一个完整的缓冲区,第二个回调是 3/4 满,第三个回调是满的,第四个是 3/4 满,依此类推。这些缓冲区是 8000 个数据包(记录 8khz 音频) - 所以我应该每次都将 1s 的音频返回给回调。我已经确认我的音频队列缓冲区大小是正确的(并且在某种程度上被行为所证实)。我究竟做错了什么?我应该在 AudioQueueNewInput 中使用不同的 RunLoop 做某事吗?我试过了,但这似乎没有什么不同......

顺便说一句,如果我在调试器中运行,每个回调 都充满了 8000 个样本 - 让我觉得这是一个线程/计时的事情。

【问题讨论】:

【参考方案1】:

显然,通过与他人讨论——以及缺乏回应,这种行为是设计好的(或损坏但不太可能修复),即使记录不正确也是如此。解决方法是在必要时在回调中适当地缓冲您的样本,并且不要期望缓冲区已满。如果您只是将数据写入文件,这根本不是问题,但如果您希望在回调中对大小一致的音频数据块进行操作,则必须自己确保这种一致性。

【讨论】:

以上是关于录制音频时 AudioQueueServices 回调的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

“音频队列服务”的好指南?

iOS进阶学习-多媒体

iOS学习45之多媒体操作

录制音频时如何将音频录制设置更改为 16Khz 和 16 位?

使用音频会话录制时如何减少录制噪音?

当我需要自定义音频效果时,我是不是需要处理音频单元,或者我可以依赖音频队列服务?