我正在使用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
模式下不可用
设置try audioSession.setMode(AVAudioSessionModeMeasurement)
之后,audioSession.availableInputs
不包含BluetoothHFP
。
此模式适用于需要最小化系统提供的输入和输出信号处理信号量的应用程序。如果在具有多个内置麦克风的设备上录制,则使用主麦克风。
并在setPreferredInput(_:)的文件中
AVAudioSessionPortDescription
必须在availableInputs
阵列中。
inPort参数的值必须是availableInputs数组中的AVAudioSessionPortDescription对象之一。如果此参数指定的端口不是当前音频路由的一部分且应用程序的会话控制音频路由,则此方法会启动路由更改以使用首选端口。
并且必须在设置模式后进行设置。
只有在设置音频会话的类别和模式并激活会话后,才必须设置首选输入端口。