AVAudioSession无法识别来自蓝牙设备的音频

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVAudioSession无法识别来自蓝牙设备的音频相关的知识,希望对你有一定的参考价值。

我正在使用AVAudiosession来收听语音输入。它适用于有线耳机,但它不适用于连接的蓝牙设备。以下是我用来设置蓝牙麦克风输入的代码

func setupSessionForRecording() {
    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.allowBluetooth]) 
    } catch let error as NSError   {
        debugPrint("Error in listening "+error.localizedDescription)
    }
    var inputsPriority: [(type: String, input: AVAudioSessionPortDescription?)] = [
        (AVAudioSessionPortLineIn, nil),
        (AVAudioSessionPortHeadsetMic, nil),
        (AVAudioSessionPortBluetoothHFP, nil),
        (AVAudioSessionPortUSBAudio, nil),
        (AVAudioSessionPortCarAudio, nil),
        (AVAudioSessionPortBuiltInMic, nil),
        ]
    for availableInput in audioSession.availableInputs! {
        guard let index = inputsPriority.index(where: { $0.type == availableInput.portType }) else { continue }
        inputsPriority[index].input = availableInput
    }
    guard let input = inputsPriority.filter({ $0.input != nil }).first?.input else {
        fatalError("No Available Ports For Recording")
    }
    do {
        try audioSession.setPreferredInput(input)
        try audioSession.setMode(AVAudioSessionModeMeasurement)
        try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
        try audioSession.setPreferredIOBufferDuration(10)
    } catch {
        fatalError("Error Setting Up Audio Session")
    }
}

此代码停止从设备麦克风获取输入,我也在蓝牙耳机中获得声音,它已准备好收听,但它不会从设备中选择任何输入。

也,

当我尝试将任何音频播放到蓝牙耳机时它不起作用。这是播放音频的代码

        do {
            let output = AVAudioSession.sharedInstance().currentRoute.outputs[0].portType
            if output == "Receiver" || output == "Speaker"{
                try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
            }
            else{
                try AVAudioSession.sharedInstance().overrideOutputAudioPort(.none)
            }
            print("Voice Out (output)" )
        } catch let error as NSError {
            print("audioSession error: (error.localizedDescription)")
            os_log("Error during changing the current audio route: %@"    , log: PollyVoiceViewController.log, type: .error, error)
        } catch {
            os_log("Unknown error during changing the current audio route", log: PollyVoiceViewController.log, type: .error)
        }
        do {
            let soundData =  try Data(contentsOf: url as URL)
            self.audioPlayer = try AVAudioPlayer(data: soundData)
            self.audioPlayer?.prepareToPlay()
            self.audioPlayer?.volume = 3.0
            self.audioPlayer?.delegate = self
            self.audioPlayer?.play()
        } catch let error as NSError {
            print("Error getting the audio file"+error.description)
        }
答案

原因是:蓝牙HFP在AVAudioSessionModeMeasurement模式下不可用

AVAudioSessionModeMeasurement

设置try audioSession.setMode(AVAudioSessionModeMeasurement)之后,audioSession.availableInputs不包含BluetoothHFP

此模式适用于需要最小化系统提供的输入和输出信号处理信号量的应用程序。如果在具有多个内置麦克风的设备上录制,则使用主麦克风。

并在setPreferredInput(_:)的文件中

AVAudioSessionPortDescription必须在availableInputs阵列中。

inPort参数的值必须是availableInputs数组中的AVAudioSessionPortDescription对象之一。如果此参数指定的端口不是当前音频路由的一部分且应用程序的会话控制音频路由,则此方法会启动路由更改以使用首选端口。

并且必须在设置模式后进行设置。

只有在设置音频会话的类别和模式并激活会话后,才必须设置首选输入端口。

以上是关于AVAudioSession无法识别来自蓝牙设备的音频的主要内容,如果未能解决你的问题,请参考以下文章

初始化 AVAudioSession 时保持蓝牙声音

iOS设置蓝牙外设播放音频

如何通过其他方法识别通过蓝牙扫描的设备

pjsip ios:蓝牙不工作

AVAudioSession 不会自动连接蓝牙 A2DP 音频?

设置 AVAudioSession 类别对来自 WKWebView 的声音没有影响