【问题标题】:iOS: Bad Mic input latency measurement resultiOS:Bad Mic 输入延迟测量结果
【发布时间】:2013-05-21 21:10:27
【问题描述】:

我正在运行一个测试来测量我的 iPhone 应用程序的基本延迟,结果令人失望:50 毫秒的播放测试应用程序。该应用程序只是拾取麦克风输入并使用相同的渲染回调将其播放出来,不涉及其他音频单元或处理。因此,对于这样的基本情况,结果似乎太糟糕了。我需要一些指示来查看结果是否有意义,或者我的测试中是否存在设计缺陷。

测试的基本思想是具有三个角色:

  1. 我的手指作为参考声源。
  2. 第一个简单的 iOS 播放应用程序(使用内置麦克风) #1 的听众。
  3. 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


【解决方案1】:

50 mS 比 2 个大小为 1024、采样率为 44.1 kHz 的音频缓冲区(一个输出,一个输入)的持续时间大约多 4 mS。

17 毫秒大约比 2 个长度为 256 的缓冲区的持续时间多 5 毫秒。

因此,在您的特定 iOS 设备上,iOS 音频延迟似乎约为 5 毫秒加上两个缓冲区的持续时间(音频输出缓冲区持续时间加上填充输入缓冲区所需的时间)。

一些 iOS 设备可能支持更短的 128 个样本的音频缓冲区大小。

【讨论】:

    【解决方案2】:

    您可以使用核心音频并将音频会话设置为具有非常低的延迟。 您可以使用AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,... 设置buffer size to be smaller

    使用较小的缓冲区会导致音频回调更频繁地发生,同时抓取较小的音频块。请记住,这只是对音频系统的建议。 iOS 将根据您的采样率和 2 的整数幂使用合适的回调时间值。

    设置缓冲时长后,您可以使用AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,...获取系统将使用的实际缓冲时长

    【讨论】:

      【解决方案3】:

      我将 Paul R 的 cmets 总结为答案,它已经解决了我的问题:

      50 ms 对应于 44.1 kHz 采样率下的总缓冲区大小约为 2048,考虑到您同时拥有记录和播放路径,这似乎并不合理。

      我不知道缓冲区大小是2048,并且在您的记录播放环回测试中可能存在多个缓冲区,但是您测试中的有效总缓冲区大小似乎在2048的数量级,这似乎不无道理。当然,如果您只对记录延迟感兴趣,正如您的问题的标题所暗示的那样,那么您需要找到一种方法将其与播放延迟分开。

      【讨论】:

        猜你喜欢
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 2018-09-20
        • 2017-10-03
        • 2014-02-17
        • 1970-01-01
        相关资源
        最近更新 更多