her*_*son 5 audio core-audio audio-recording ios
我正在 iPhone/iPad 上使用 CoreAudio 开发一个应用程序。该应用程序既通过扬声器(输出)播放音频,又同时从麦克风(输入)录制音频。就本应用程序而言,能够比较输入和输出,特别是它们在时域中的“排列”程度,这一点非常重要。因此,正确计算输入和输出通道之间的总延迟至关重要。
我正在 3 种不同的设备上进行测试。一部 iPhone、一部 iPad 和模拟器。我凭经验确定 iPhone 的延迟约为 4050 个样本,iPad 接近 4125 个样本,模拟器大约为 2500 个样本。
经过大量研究(又称谷歌搜索),我在网上发现了一些关于计算 CoreAudio 延迟的讨论,但它们通常涉及在 OSX 而不是 iOS 上使用 CoreAudio。因此,它们指的是 iOS 上不存在的各种功能。然而,对于 iOS 来说,正确的解决方案似乎是使用、和AVAudioSession的某种组合。然而,这些值的组合似乎无法达到上述凭经验确定的值。此外,当我在调用之前和之后检查每个参数时,我会得到截然不同的值。更令人困惑的是,这些值非常接近调用之前的预期延迟,这与我的预期相反。inputLatencyoutputLatencyIOBufferDurationAudioUnitInitializeAudioUnitInitialize
这是我看到的价值观。
模拟器总是为输入和输出返回 0.01,但我怀疑这些不是实际/正确的值,并且模拟器不支持此功能。
另一个可能有趣的注意事项是我正在使用kAudioUnitSubType_VoiceProcessingIO而不是kAudioUnitSubType_RemoteIO我期望增加一些额外的延迟。我的假设是这将包含在inputLatency值中,但也许我需要查询另一个值来包含它?
确定 iOS 中输入和输出之间的总延迟的正确方法是什么?
您看到的音频延迟差异的部分原因可能是由于尝试将应用程序的音频处理配置为每秒 44100 个样本。
任何新 iOS 设备上的本机硬件采样率为 48k sps(或者可能是其整数倍),因此将音频单元初始化为 44.1k IO 可能会向音频图表添加一个或两个(隐藏软件)采样率转换过程。您可以通过以 48k sps(甚至可能是 96k 或 192k)运行应用程序的内部信号路径来消除这种延迟差异。如果您需要使用 44.1 .wav 文件,请在音频单元图之外以及应用程序自己的前/后实时处理代码内处理任何所需的速率转换(例如,如果需要,转换并重写文件)。
您还可以通过 setPreferredIOBufferDuration() 使用音频会话请求更短的音频缓冲持续时间(在较新的 iOS 设备上可能小于 5 毫秒),从而减少实际的物理输入到输出延迟。
不确定上述是否与语音处理子类型兼容。
另一方面,iOS 模拟器可能在硬件支持本机 44.1k 采样率的 Mac 上运行。因此,这可能是您测量的 iOS 设备与模拟器延迟存在差异的原因。
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |