【发布时间】:2013-05-21 21:10:27
【问题描述】:
我正在运行一个测试来测量我的 iPhone 应用程序的基本延迟,结果令人失望:50 毫秒的播放测试应用程序。该应用程序只是拾取麦克风输入并使用相同的渲染回调将其播放出来,不涉及其他音频单元或处理。因此,对于这样的基本情况,结果似乎太糟糕了。我需要一些指示来查看结果是否有意义,或者我的测试中是否存在设计缺陷。
测试的基本思想是具有三个角色:
- 我的手指作为参考声源。
- 第一个简单的 iOS 播放应用程序(使用内置麦克风) #1 的听众。
- Mac(带有 USB 麦克风和 Audacity)作为 #1 的第二个听众和 iOS 输出的唯一监听器(通过连接的扬声器 iOS 耳机插孔)。
然后,当 Audacity 处于录音模式时,Mac 会从我的手指中拾取声音,并从近距离的 iOS 扬声器中拾取它的“克隆”。最后,我只是简单地直观地观察了 Audacity 录制轨道中的波形,并测量了两个录制快照的峰值之间的时间间隔。
这绝不是一个超级准确的测量,但至少 Mac 录制管道的固有延迟应该以这种方式被抵消。所以误差应该主要来自峰值距离测量,我假设它应该比音频管道延迟小得多,可以忽略不计。
我期待 20 毫秒或更低的延迟,但显然结果给了我 50~60 毫秒。 我的 ASBD 使用 kAudioFormatFlagsCanonical 和 kAudioFormatLinearPCM 作为格式。
【问题讨论】:
-
那么 50 ms 对应于 44.1 kHz 采样率下大约 2048 的总缓冲区大小,考虑到您同时拥有记录和播放路径,这似乎并不合理。
-
谢谢保罗!我没有意识到默认情况下缓冲区大小是 2048。这将是有意义的,因为 2048/44.1k 意味着 46ms 延迟!注意我找到了改变缓冲区大小的方法。非常感谢!
-
不知道buffer大小是2048,你的record-playback loopback测试中可能有不止一个buffer,但是好像有效的total您测试中的缓冲区大小可能是 2048 的数量级,这似乎不是不合理的。当然,如果您只对记录延迟感兴趣,正如您的问题的标题所暗示的那样,那么您需要找到一种方法将其与播放延迟分开。
-
是的,这很有意义。通过将音频会话缓冲区大小属性降低到 5 毫秒,我现在获得了 17 毫秒的播放延迟,这是我所期待的。谢谢你的回答。如果你不介意,我会把你的 cmets 作为答案贴出来并标记为正确,好吗?
标签: iphone ios audio core-audio microphone