iOS:Bad Mic输入延迟测量结果

时间:2013-05-21 21:10:28

标签: iphone ios audio core-audio microphone

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

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

  1. 我的手指拍摄为参考声源。
  2. 一个简单的iOS play-thru应用程序(使用内置麦克风)作为第一个 聆听#1。
  3. Mac(带有USB麦克风和Audacity)作为#1和#的第二个监听器 iOS输出的唯一监听器(通过连接的扬声器) iOS耳机插孔)。
  4. 然后,在Audacity处于录制模式时,Mac会从近距离接收来自我手指的声音和来自iOS扬声器的“克隆”。最后,我只是直观地观察Audacity记录轨道中的波形,并测量两个记录按钮峰值之间的时间间隔。

    这绝不是一个超级精确的测量,但至少Mac记录管道的固有延迟应该以这种方式被取消。所以错误应该主要来自峰值距离测量,我认为它应该比音频管道延迟小得多并且可以忽略。

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

3 个答案:

答案 0 :(得分:1)

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

17 mS比长度为256的2个缓冲区的持续时间长约5 mS。

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

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

答案 1 :(得分:1)

您可以使用核心音频并设置音频会话以获得非常低的延迟。 您可以使用AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,...

设置buffer size to be smaller

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

设置缓冲区持续时间后,您可以使用AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,...

获取系统将使用的实际缓冲区持续时间

答案 2 :(得分:0)

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

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

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