使用AVAudioSession更改音频输入源会导致崩溃

时间:2018-11-17 14:06:16

标签: ios swift xcode avaudiosession avaudioengine

我正在开发一个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部分,但徒劳无功。

任何反馈将不胜感激!

2 个答案:

答案 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)
  })
}