如何使用内置麦克风输入和蓝牙输出

问题描述

我目前正在尝试让我的设备通过设备麦克风为捕获会话录制音频,同时在蓝牙设备 (AirPods) 上输出音频。

我这样做的原因是因为使用蓝牙耳机,尤其是 AirPods,当蓝牙麦克风处于活动状态时,播放质量很糟糕。

我尝试使用 setPreferredInput 但它改变了输入和输出,这是我目前所拥有的。

   do {
        let session = AVAudioSession.sharedInstance()
        try session.setCategory(.playAndRecord,mode: .default,options: [.defaultToSpeaker,.allowBluetooth,.mixWithOthers])
        print(session.currentRoute.outputs)
        try session.setAllowHapticsAndSystemSoundsDuringRecording(true)
        try session.setActive(true,options: .notifyOthersOnDeactivation)
        if let mic = session.availableInputs?.first(where: {$0.portType == AVAudioSession.Port.builtInMic}) {
            try session.setPreferredInput(mic)
        }
    } catch let err {
        print("Audio session err",err.localizedDescription)
    }

我还看到了一个旧的 api,它可能有帮助,但现在似乎已经贬值很久了(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput)用于 AudioSession。

App Store 上还有其他应用似乎已经实现了分割录音,所以似乎是可能的。

解决方法

去掉allowBluetooth并使用allowBluetoothA2DP。您也不希望 defaultToSpeaker 在这里。

“允许蓝牙”实际上意味着“首选 HFP”,这就是音频如此糟糕的原因。 HFP 是一种低带宽双向协议,通常用于电话呼叫。枚举名称非常令人困惑 IMO。人们一直对此感到困惑。

A2DP 是一种高带宽单向协议(它不支持麦克风)。当您提出请求时,耳机的麦克风将被禁用,并且默认情况下您将获得 iPhone 的麦克风(前提是没有其他有线麦克风可用,但这种可能性很小)。