在音频引擎输入节点上安装水龙头时出错
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 似乎都有效,但无法保证您会获得所需的采样率。
以下无效:
- 点击关闭 engine.inputNode 设置我的自定义格式。 (例外,与 OP 相同)
- 使用我的自定义格式添加混音器并点击它。 (例外)
- 添加一个混音器,将其与inputNode的格式连接,将混音器连接到主混音器以我的自定义格式,然后移除outputNode的输入,以免将音频发送到扬声器并获得即时反馈。 (有效,但全部为零)
- 在 AVAudioEngine 中根本不使用我的自定义格式,而是使用 AVAudioConverter 从我的水龙头中的硬件速率进行转换。 (未设置缓冲区长度,无法判断结果是否正确)
这是 iOS 12.3.1.
每当代码到达
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 似乎都有效,但无法保证您会获得所需的采样率。
以下无效:
- 点击关闭 engine.inputNode 设置我的自定义格式。 (例外,与 OP 相同)
- 使用我的自定义格式添加混音器并点击它。 (例外)
- 添加一个混音器,将其与inputNode的格式连接,将混音器连接到主混音器以我的自定义格式,然后移除outputNode的输入,以免将音频发送到扬声器并获得即时反馈。 (有效,但全部为零)
- 在 AVAudioEngine 中根本不使用我的自定义格式,而是使用 AVAudioConverter 从我的水龙头中的硬件速率进行转换。 (未设置缓冲区长度,无法判断结果是否正确)
这是 iOS 12.3.1.