【问题标题】:AudioToolbox - Callback delay while recordingAudioToolbox - 录音时的回调延迟
【发布时间】:2011-10-04 22:35:51
【问题描述】:

我最近一直在为 iOS 开发一个非常具体的项目,我的研究使我得到了几乎最终的代码。到目前为止,我已经解决了我发现的所有极端困难,但在这一点上我似乎没有任何线索(关于解决它的原因和可能性)。

我设置了我的音频队列(采样率 44100,格式 LinearPCM,每通道 16 位,每帧 2 字节,每帧 1 通道......)并开始使用 12 个音频缓冲区录制声音。但是,每 4 次回调之后似乎会有延迟。

情况如下:前 4 个回调的调用间隔约为 2 毫秒。但是,在第 4 和第 5 之间,有大约 60ms 的延迟。同样的事情发生在 8 号和 9 号之间,12 号和 13 号之间……

似乎每帧的字节数和延迟时间之间存在关系。我知道这一点,因为如果我更改为每帧 4 个字节,我会在第 8 和第 9 之间开始延迟,然后在第 16 和第 17、第 24 和第 25 之间......尽管如此,似乎没有延迟时刻与缓冲区数量之间的任何关系。

回调函数只做两件事:将音频数据(inBuffer->mAudioData)存储在我的类可以使用的数组中;并调用另一个 AudioQueueEnqueueBuffer,将当前缓冲区放回队列中。

有人遇到过这个问题吗?有谁知道,至少,这可能是什么原因?

提前谢谢你。

【问题讨论】:

    标签: iphone ios audio callback delay


    【解决方案1】:

    音频队列 API 似乎在 RemoteIO 音频单元 API 之上运行,其实际音频缓冲区大小可能与您的音频队列缓冲区大小无关,并且在您的示例中大于该大小。因此,只要 RemoteIO 缓冲区准备就绪,一堆较小的 AQ 缓冲区就会很快被填满。然后你会等待更长的延迟,等待一些更大的缓冲区被样本填充。

    如果您想要更好地控制(更均匀间隔)缓冲延迟,请尝试直接使用 RemoteIo 音频单元。

    【讨论】:

    • 非常感谢,这正是我正在寻找的路径。使用 RemoteIO API 重写我的代码花了我几个小时,因为文档和示例代码并不简单,而且有很多“陷阱”需要理解。但它现在终于奏效了,我实际上可以说你的答案是完美的。没有延迟,但序列非常稳定,大约为 2.94 毫秒(在 iPhone 4 上),在可能的最快配置中。
    • @27deAbril 你能举个例子吗?或者您是否设法使用 AudioQueue 修复它?我花了几天的时间来理解我遇到的问题。它用 1024 个样本填充内部缓冲区,然后一个接一个地调用回调(队列缓冲区为 160 字节)。
    • @AndaluZ 很抱歉,但不幸的是,已经有太多年了,我无法再访问该代码了。据我所知,这只能通过使用 RemoteIO 音频单元 API 重写代码来解决。
    • 这正是我正在做的。 AudioQueue 无法更改 CoreAudio 的内部缓冲区。使用带有 RemoteIO 的 AudioUnit 是唯一的解决方案。谢谢你的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2013-06-12
    相关资源
    最近更新 更多