0

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

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

  1. 我的手指弹响作为参考声源。
  2. 一个简单的 iOS play-thru 应用程序(使用内置麦克风)作为 #1 的第一个监听器。
  3. Mac(带有 USB 麦克风和 Audacity)作为 #1 的第二个监听器和 iOS 输出的唯一监听器(通过通过 iOS 耳机插孔连接的扬声器)。

然后,当 Audacity 处于录音模式时,Mac 会从我的手指中拾取声音,并从近距离的 iOS 扬声器中拾取它的“克隆”。最后,我只是直观地观察了 Audacity 录制轨道中的波形,并测量了两个录制快照的峰值之间的时间间隔。

这绝不是一个超级准确的测量,但至少 Mac 录制管道的固有延迟应该以这种方式被抵消。所以误差应该主要来自峰值距离测量,我假设它应该比音频管道延迟小得多,可以忽略不计。

我期待 20 毫秒或更低的延迟,但显然结果给了我 50~60 毫秒。我的 ASBD 使用 kAudioFormatFlagsCanonical 和 kAudioFormatLinearPCM 作为格式。

4

3 回答 3

1

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

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

所以看起来iOS音频延迟大约是5毫秒加上两个缓冲区的持续时间(音频输出缓冲区持续时间加上填充输入缓冲区所需的时间)......在您的特定iOS设备上。

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

于 2013-11-30T20:35:49.410 回答
1

您可以使用核心音频并将音频会话设置为具有非常低的延迟。您可以使用以下方法将缓冲区大小设置为更小AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,...

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

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

于 2014-01-11T17:00:01.777 回答
0

我将总结 Paul R 的评论作为答案,它解决了我的问题:

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

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

于 2013-05-21T21:50:09.293 回答