AVAudioSession 和 AirPods

Posted

技术标签:

【中文标题】AVAudioSession 和 AirPods【英文标题】:AVAudioSession and AirPods 【发布时间】:2017-12-14 15:21:12 【问题描述】:

我的应用似乎不适用于 AirPods。现在我正在使用此代码进行播放和录制:

    let audiosession = AVAudioSession.sharedInstance()
    do  try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.defaultToSpeaker)
    catch 
        print("audioSession properties weren't set because of an error.")
    

我把defaultToSpeaker改成allowBluetooth就够了吗?

附:我知道这是一个非常愚蠢的问题,因为更改这条线并检查会更简单,但我现在没有 AirPods,所以我唯一的选择是将新版本上传到 Testflight(和我想以最少的迭代次数来做到这一点)。

更新:(相当幼稚的方法——但我只需要使用可用的蓝牙耳机):

func selectDevice(audioSession: AVAudioSession) 

    var headphonesExist = false
    var bluetoothExist = false
    var speakerExist = false

    let currentRoute = AVAudioSession.sharedInstance().currentRoute

    for output in audioSession.currentRoute.outputs 
        print(output)

        if output.portType == AVAudioSessionPortHeadphones || output.portType == AVAudioSessionPortHeadsetMic 
            headphonesExist = true
        

        if output.portType == AVAudioSessionPortBluetoothA2DP || output.portType == AVAudioSessionPortBluetoothHFP 
            bluetoothExist = true
        

        if output.portType == AVAudioSessionPortBuiltInSpeaker 
            speakerExist = true
        
    

    if bluetoothExist == true 
        do  try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.allowBluetooth)  catch 
            print("error with audiosession: bluetooth")
        
    

【问题讨论】:

【参考方案1】:

您需要在options 参数中添加对蓝牙的支持,如下所示:

[AVAudioSessionCategoryOptions.defaultToSpeaker, .allowBluetoothA2DP]

.allowBluetoothA2DP 将允许高质量音频输出到蓝牙设备并限制所述设备上的麦克风输入,而.allowBluetooth 将默认 HFP 兼容(输入/输出)蓝牙设备为支持麦克风输入的低质量 HFP .

【讨论】:

在我的情况下不起作用。我想同时录音和播放。但是当我尝试启动音轨时,AirPods 会作为允许的音频 io 设备消失。 allowBluetoothA2DP 对我没有帮助。 经过几天的测试,我可以确认这一点。答案是正确的。 A2DP 是目前最好的解决方案。根据我的经验,HFP 太糟糕了。【参考方案2】:

这是请求适当许可的完整来源。 您所要做的就是使用“.allowBluetoothA2DP”添加一个模式

我已经申请了 Swift 5

func requestPermissionForAudioRecording()
    recordingSession = AVAudioSession.sharedInstance()
    
    do 
      // only with this without options, will not capable with your Airpod, the Bluetooth device.
      //  try recordingSession.setCategory(.playAndRecord, mode: .default)
      try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowAirPlay, .allowBluetoothA2DP])
      try recordingSession.setActive(true)
      recordingSession.requestRecordPermission()  allowed in
        DispatchQueue.main.async 
          if allowed 
            // Recording permission has been allowed
            self.recordingPermissionGranted = true
           else 
            // failed to record!
          
        
      
     catch let err 
      // failed to record!
      print("AudioSession couldn't be set!", err)
    
  

【讨论】:

以上是关于AVAudioSession 和 AirPods的主要内容,如果未能解决你的问题,请参考以下文章

iOS 音频-AVAudioSession

AVAudioSession 配置用于录制和与他人一起播放

AVAudioSession 输出选择

IOS录制和播放需要不同的AVAudioSession

使用 AVAudioSession 时背景音频安静

如何更改 AVAudioSession 的输入增益?代码