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

时间:2018-12-14 11:50:05

标签: ios swift audio-recording avaudioengine avaudiofile

只要代码到达 inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) {[weak self] (buffer:AVAudioPCMBuffer, when:AVAudioTime),应用因以下错误而崩溃

  

由于未捕获的异常'com.apple.coreaudio.avfaudio'而终止应用程序,原因:'所需条件为假:format.sampleRate == hwFormat.sampleRate'

在添加另一个水龙头之前,我厌倦了拆除水龙头,并且确保不要添加多个水龙头。 奇怪的是,该应用程序在小于12的iOS上可以正常运行,并且在所有模拟器上都可以正常运行。

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

2 个答案:

答案 0 :(得分:3)

这是采样率不匹配。

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

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

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

答案 1 :(得分:-1)

我发现唯一可以改变采样率的东西是

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

不幸的是,尽管似乎8000、12000、16000、22050、44100都可以正常工作,但不能保证将获得所需的采样率。

以下内容无效:

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

这是iOS 12.3.1。