2017-10-09 160 views
1

我正在使用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) 
     } 
+0

嗨,你解决了吗? –

回答

0

原因是:BluetoothHFP不可用AVAudioSessionModeMeasurement模式

AVAudioSessionModeMeasurement

在设置try audioSession.setMode(AVAudioSessionModeMeasurement),该audioSession.availableInputs不包含BluetoothHFP

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

setPreferredInput(_:)

AVAudioSessionPortDescription文档中必须是availableInputs阵列英寸

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

它必须在设置模式后设置。

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