iOS精确AudioTimeStamp时渲染音频单元

问题描述:

在我的AudioInputRenderCallback我期待捕捉某些音频事件的准确时间戳。为了测试我的代码,我输入了@ 120BPM或每500毫秒的点击轨迹(点击是准确的,我检查了并且双重检查)。我首先得到每个样本的分贝,并检查它是否超过阈值,这是按预期工作的。然后我从AudioTimeStamp中获取hostTime,并将其转换为毫秒。第一次点击被分配到该静态时间戳,第二次通过计算间隔,然后重新分配给静态时间戳。我预计会看到500个区间。为了能够正确计算点击,我必须在5毫秒内完成。这些数字似乎在510 & 489之间来回反弹。我知道这不是一个RTOS,但iOS可以做到这一点吗?使用AudioUnitTimeStamp的mach_absolute_time成员是否有任何问题?iOS精确AudioTimeStamp时渲染音频单元

+0

是否有原因您不能使用sampleTime或wordClock字段? – iluvcapra 2013-02-25 18:28:12

+0

我的理解是,他们都代表相同的时间点,这意味着他们将具有相同的准确性水平。 – estobbart 2013-02-25 18:42:57

音频单元是基于缓冲区的。 iOS音频单元缓冲区的最小长度似乎约为6 mS。所以如果您使用缓冲区回调的时间戳,您的时间分辨率或时间采样抖动将大约为+ - 6 mS。

如果您查看音频单元缓冲区内的实际原始PCM采样并匹配“攻击”瞬态(通过阈值或自相关等),您可能会获得亚毫秒分辨率。

+0

我同意并喜欢这种方法。不确定如何实施。如果我不使用AU时间戳,一旦我确定了它是哪个样本,时间从哪里来? (我实际上已经在查看每个原始PCM样本。) – estobbart 2013-02-25 20:58:34

+0

如果我计算正确,每个缓冲区大约1024个样本@ 0.022毫秒,每个样本@ 44.1k。每个缓冲区大约需要22毫秒来处理,这几乎与我报告的510-489相同。 – estobbart 2013-02-25 21:02:25