我正在开发一个iOS应用,该应用利用语音到文本来接收来自用户的音频输入。但是,当我测试多种现实生活场景时,每次将外接蓝牙耳机连接到手机时,我的应用程序都会崩溃。我注意到,在inputNode
对象中的AVAudioEngine
上安装水龙头时会发生崩溃。
func configureAudioTap() {
let audioEngine = self.audioEngine
let inputNode = audioEngine.inputNode
let inputNodeFormat = inputNode.outputFormat(forBus: 0)
audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: inputNodeFormat, block: { [unowned self] buffer, time in
self.recognitionRequest?.append(buffer)
})
}
在控制台中,出现以下错误
exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: format.sampleRate == hwFormat.sampleRate'
调试时,我注意到我的蓝牙耳机和内置麦克风的采样率不同。我也仔细阅读了《音频会话编程指南》文档,特别是Responding to Route Changes部分,但徒劳无功。
任何反馈将不胜感激!
答案 0 :(得分:1)
更改此:
let inputNodeFormat = inputNode.outputFormat(forBus: 0)
对此:
let inputNodeFormat = inputNode.inputFormat(forBus: 0)
让我们知道它是否崩溃。
我有一些类似的问题,但并非每次都有。
答案 1 :(得分:1)
您之间需要一个混合器节点。调音台将处理输入源更改,而不会导致应用程序崩溃。您的代码如下:
func configureAudioTap() {
let audioEngine = self.audioEngine
let inputNode = audioEngine.inputNode
let inputNodeFormat = inputNode.outputFormat(forBus: 0)
let mixerNode = AVAudioMixerNode()
audioEngine.attach(mixerNode)
audioEngine.connect(inputNode, to: mixerNode, format: nil)
mixerNode.installTap(onBus: 0, bufferSize: 1024, format: inputNodeFormat, block: { [unowned self] buffer, time in
self.recognitionRequest?.append(buffer)
})
}