Изменение источника аудиовхода с помощью AVAudioSession вызывает сбой - PullRequest
0 голосов
/ 17 ноября 2018

Я занимаюсь разработкой приложения для iOS, которое использует преобразование речи в текст для получения аудиовхода от пользователя. Однако, поскольку я тестировал несколько реальных сценариев, мое приложение зависало каждый раз, когда я подключал внешнюю Bluetooth-гарнитуру к телефону. Я заметил, что сбой происходит при установке крана на 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'

При отладке я заметил, что моя гарнитура Bluetooth и встроенный микрофон имеют разные частоты дискретизации. Я также просмотрел документацию к руководству по программированию аудиосеанса, в частности, раздел Ответ на изменение маршрута , но тщетно.

Любые отзывы будут высоко оценены!

Ответы [ 2 ]

0 голосов
/ 08 августа 2019

Вам нужен узел микшера между ними.Микшер будет обрабатывать изменения источника ввода без сбоя приложения.Ваш код будет выглядеть так:

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)
  })
}
0 голосов
/ 19 ноября 2018

Изменить это:

let inputNodeFormat = inputNode.outputFormat(forBus: 0)

к этому:

let inputNodeFormat = inputNode.inputFormat(forBus: 0)

и дайте нам знать, если он выйдет из строя.

У меня есть похожие проблемы, но не каждый раз.

...