【问题标题】:Changing audio input source with AVAudioSession causes crash使用 AVAudioSession 更改音频输入源会导致崩溃
【发布时间】:2018-11-17 14:06:15
【问题描述】:

我正在开发一个 iOS 应用程序,该应用程序利用语音到文本来接收来自用户的音频输入。但是,当我在测试多个真实场景时,每次将外部蓝牙耳机连接到手机时,我的应用程序都会崩溃。我注意到在AVAudioEngine 对象中的inputNode 上安装水龙头时会发生崩溃。

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 部分,但没有成功。

非常感谢任何反馈!

【问题讨论】:

  • 嗨。我也面临着类似的问题。你能解决这个问题吗?还有一个问题,您是否能够在每个蓝牙耳机上重现此问题,如果没有,您使用的是哪种耳机?这可能有助于我更好地联系。
  • 你好@IndusWarrior,我还没有解决这个问题。仅在录制时 切换音频源时仍然会发生这种情况。如果有帮助,我正在使用 AirPods!
  • 感谢您的回复。是的,它有帮助,在我的情况下,罪魁祸首也是 Airpods,我无法使用其他蓝牙耳机成功复制。

标签: ios swift xcode avaudiosession avaudioengine


【解决方案1】:

改变这个:

let inputNodeFormat = inputNode.outputFormat(forBus: 0)

到这里:

let inputNodeFormat = inputNode.inputFormat(forBus: 0)

如果它崩溃了,请告诉我们。

我有一些类似的问题,但不是每次。

【讨论】:

  • 你好@Deryck,我以前尝试过这个解决方案。但是,它并没有解决全部问题,因为当音频会话正在运行并且输入设备发生变化时,仍然会发生崩溃。它只解决了使用不同输入设备启动录制的情况。
  • 我同意,但是您应该在会话更改时暂停任何音频输入/输出并重新启动它。您使用的是什么类别?有什么选择?
  • 我正在使用 .playAndRecord 类别伴侣。
  • 感谢为我工作。仍然需要在通知 AVAudioEngineConfigurationChange 或 AVAudioSessionRouteChange 中取消点击节点。 developer.apple.com/documentation/avfoundation/avaudiosession/…
【解决方案2】:

您需要一个混合器节点。混音器将处理输入源更改而不会导致应用程序崩溃。您的代码将如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多