我正在使用iPhone / iPad上使用CoreAudio的应用程序。该应用程序既可以通过扬声器播放音频(输出),也可以同时录制来自麦克风的音频(输入)。对于本应用程序而言,能够比较输入和输出,特别是它们在时域中的“排列”情况,非常重要。因此,正确计算输入和输出通道之间的总延迟至关重要。
我正在3种不同的设备上进行测试。 iPhone,iPad和模拟器。我已经能够凭经验确定iPhone的延迟大约为4050个样本,iPad的延迟接近4125个样本,而模拟器大约为2500个样本。
经过大量研究(又称Google搜索),我发现在线上有一些关于在CoreAudio中计算延迟的讨论,但是这些讨论通常与在OSX而非iOS上使用CoreAudio有关。因此,它们引用了iOS上不存在的各种功能。但是,似乎对于iOS而言,正确的解决方案是使用AVAudioSession
和inputLatency
,outputLatency
和IOBufferDuration
的某种组合。但是,这些值的组合似乎没有累加到以上根据经验确定的值。此外,在调用AudioUnitInitialize
之前和之后检查每个参数时,对于每个参数我都获得了截然不同的值。更令人困惑的是,这些值更接近预期的延迟before对AudioUnitInitialize
的调用,这与我的预期相反。
这里是我所看到的值。
模拟器始终将输入值作内,外返回0.01,但我怀疑这些不是实际值/正确值,并且模拟器不支持此功能。
[另一个可能有趣的注意事项是,我正在使用kAudioUnitSubType_VoiceProcessingIO
而不是kAudioUnitSubType_RemoteIO
,但我确实希望添加一些额外的延迟。我的假设是将其包含在inputLatency
值中,但是也许我需要查询另一个值以包含此值?
确定iOS中输入和输出之间总延迟的正确方法是什么?
您看到的部分音频延迟差异可能是由于尝试将应用的音频处理配置为每秒44100个样本。
在任何新的iOS设备上,本机硬件采样率均为48k sps(或其整数倍),因此为44.1k IO初始化音频单元很可能会在音频图中添加一个或两个内部采样率转换过程。您可以通过以48k sps(甚至可能是96k或192k)运行应用程序的信号路径来消除这种延迟差异。
您还可以通过setPreferredIOBufferDuration()使用音频会话来请求更短的音频缓冲区持续时间(在较新的iOS设备上可能少于5毫秒,从而减少实际的物理输入到输出延迟。