安装音频引擎输入节点上的tap时出现错误

4
每当代码到达inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) {[weak self] (buffer:AVAudioPCMBuffer, when:AVAudioTime)时,应用程序都会崩溃,并显示以下错误信息:

终止应用程序,原因是未捕获的异常“com.apple.coreaudio.avfaudio”,原因:“必需条件为false:format.sampleRate == hwFormat.sampleRate”

我尝试在添加新的tap之前删除tap,并确保不会添加多个tap。奇怪的是,该应用程序在iOS 12以下的系统上运行良好,并且在所有模拟器上都可以正常工作。
该应用程序仅在安装了iOS 12的真实设备上崩溃。 我尝试寻找解决方案,但没有找到任何东西。
2个回答

8

这是一个采样率不匹配的示例。

输入节点的格式无法更改,因此您需要进行匹配。 installTap 侦听节点的输出,请使用 inputNode 的输出格式。

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

另一个选择是将输入连接到混音器,然后使用首选录制格式在混音器上进行采样。混音器会在其输入和输出之间执行隐式的采样率转换。


我遇到了完全相同的问题。之前没有任何问题。在IOS 12真机上开始崩溃。然而,修复对我没有起作用。 - user6631314

-3
我发现唯一有效的更改采样率的方法是:
AVAudioSettings.sharedInstance().setPreferredSampleRate(...)

很遗憾,您无法保证获得所需的采样率,尽管似乎8000、12000、16000、22050、44100都可以工作。

以下方法不起作用:

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

这是在iOS 12.3.1上测试的。


与https://dev59.com/pJrga4cB1Zd3GeqPt-vd#57104029相同 - matt
停止复制粘贴,不要没有自己的解释。 - famfamfam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接