我有一个非常简单的iOS Core Audio应用程序,具有以下结构:
Remote I/O Unit Input Bus --> Render Callback --> Remote I/O Unit Output Bus
由远程I / O输出总线调用的渲染回调函数通过调用远程I / O输入总线上的AudioUnitRender()
从输入硬件中提取样本。然后,它处理/影响这些样本,写入提供的AudioBufferList*
并返回,从而导致受影响的样本通过输出硬件播放。一切顺利。
我的问题是如何知道或计算精确时间:
将AudioTimeStamp
结构传递给有效mHostTime
,mSampleTime
&的渲染回调。 mRateScalar
值。我不清楚这个时间戳到底反映了什么。文档说明:
inTimeStamp 与此音频单元调用相关联的时间戳呈现。
这听起来像是表示调用渲染的时间,但是它与输入样本 捕获的时间和输出样本之间的关系如何(如果有的话)是呈现?
在线的几个资源都说使用mach_absolute_time()
或CACurrentMediaTime()
来计算当前的主机时间,但是我似乎无法从当前主机时间到过去或将来的主机时间建立连接。 / p>
来自Apple邮件列表线程的以下引用说明了三个时间戳,包括过去输入数据和未来输出数据的单独时间戳。这正是我正在寻找的,但我相信这是在OS X上运行并使用AUHAL I / O.我找不到在iOS上检索这些时间戳的方法。
因此,CoreAudio的工作方式是I / O proc触发并给你3 时间戳:(1)输入数据的时间戳 - 如果有的话 课程。这将始终至少是过去的缓冲区大小(2)Is 现在的时间戳 - 当I / O proc被唤醒运行时(3)是 您将提供的输出数据的时间戳。这将是 总是在未来的某个时间 - 通常它是一个缓冲区大小 未来。 (http://lists.apple.com/archives/coreaudio-api/2005/Sep/msg00220.html)
我怀疑我可能会遗漏一些明显的东西,所以希望有人可以对此有所了解。
提前致谢。
答案 0 :(得分:1)
如果您尝试考虑实际捕获时间和实际输出时间,也许您可以检查音频会话中的硬件延迟属性。音频单元也具有延迟属性。不确定这是否能为您提供所需的准确度。