5

问题

我有一个非常简单的 iOS Core Audio 应用程序,其结构如下:

Remote I/O Unit Input Bus --> Render Callback --> Remote I/O Unit Output Bus

由远程 I/O 输出总线调用的渲染回调函数通过调用AudioUnitRender()远程 I/O 输入总线从输入硬件中提取样本。然后它处理/影响这些样本,写入提供的样本AudioBufferList*并返回,从而通过输出硬件播放受影响的样本。一切正常。

我的问题是我如何知道或计算出准确的时间:

  • 样本由输入硬件捕获
  • 样本实际上是在输出硬件上播放的

讨论

一个结构体通过有效的, &值AudioTimeStamp传递给渲染回调。我不清楚这个时间戳到底反映了什么。该文档指出:mHostTimemSampleTimemRateScalar

inTimeStamp 与此音频单元渲染调用关联的时间戳。

这听起来像是代表调用渲染的时间,但是这与捕获输入样本和渲染输出样本时间有什么关系(如果有的话) ?

网上的一些资源谈到使用mach_absolute_time()CACurrentMediaTime()计算当前主机时间,但是我似乎无法从当前主机时间连接到过去或未来主机时间。

以下来自 Apple 邮件列表线程的引用谈到了三个时间戳,包括过去输入数据和未来输出数据的单独时间戳。这正是我正在寻找的,但是我相信这是在 OS X 上运行并使用 AUHAL I/O。我找不到在 iOS 上检索这些时间戳的方法。

因此,CoreAudio 的工作方式是触发 I/O proc 并为您提供 3 个时间戳:(1)是输入数据的时间戳 - 如果有的话。这将始终至少是过去的缓冲区大小 (2) 是现在的时间戳 - 当 I/O proc 被唤醒以运行时 (3) 是您将提供的输出数据的时间戳。这总是在未来的某个时间——通常是未来的缓冲区大小。(http://lists.apple.com/archives/coreaudio-api/2005/Sep/msg00220.html

我怀疑我可能遗漏了一些明显的东西,所以希望有人能对此有所了解。

提前致谢。

4

1 回答 1

1

如果您尝试考虑实际捕获时间和实际输出时间,也许您可​​以检查音频会话中的硬件延迟属性。音频单元还具有延迟属性。不确定这是否会给您所需的准确性。

于 2013-11-05T12:48:47.193 回答