在音频引擎输入节点上安装水龙头时出错

Error when installing a tap on audio engine input node

每当代码到达 inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) {[weak self] (buffer:AVAudioPCMBuffer, when:AVAudioTime),应用崩溃并出现以下错误

Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: format.sampleRate == hwFormat.sampleRate'

我厌倦了在添加另一个水龙头之前移除水龙头,并且我确保我添加的水龙头不超过一个。 奇怪的是,该应用程序在 iOS 小于 12 时运行良好,并且在所有模拟器上运行良好。

它仅在 iOS 12 的真实设备上崩溃。 我尝试寻找解决方案,但找不到任何东西。

这是采样率不匹配。

输入节点的格式无法更改,需要匹配。 installTap监听一个节点的输出,所以使用inputNode的输出格式。

inputNode.installTap(onBus: 0, bufferSize: 1024, format: inputNode.outputFormat(forBus: 0))

另一种选择是将输入连接到混音器,然后使用首选录音格式点击混音器。混频器在其输入和输出之间执行隐式采样率转换。

我发现唯一可以改变采样率的方法是

AVAudioSettings.sharedInstance().setPreferredSampleRate(...)

遗憾的是,虽然 8000、12000、16000、22050、44100 似乎都有效,但无法保证您会获得所需的采样率。

以下无效:

  1. 点击关闭 engine.inputNode 设置我的自定义格式。 (例外,与 OP 相同)
  2. 使用我的自定义格式添加混音器并点击它。 (例外)
  3. 添加一个混音器,将其与inputNode的格式连接,将混音器连接到主混音器以我的自定义格式,然后移除outputNode的输入,以免将音频发送到扬声器并获得即时反馈。 (有效,但全部为零)
  4. 在 AVAudioEngine 中根本不使用我的自定义格式,而是使用 AVAudioConverter 从我的水龙头中的硬件速率进行转换。 (未设置缓冲区长度,无法判断结果是否正确)

这是 iOS 12.3.1.