关于iPhone:在iOS中通过蓝牙播放时从内置麦克风进行录制

Recording from Built-In Mic when Playing through Bluetooth in iOS

是否可以从iPhone的内置麦克风接收音频输入,并同时通过Bluetooth耳机播放该音频?

我的目标是即使输出设备是头戴式耳机,也始终将内置麦克风用作输入设备,因为在我的用例中,内置麦克风更加方便。

当输出设备是有线耳机(例如与iPhone捆绑在一起的耳机)时,我知道如何实现我的目标。我只需插入有线耳机,然后调用以下方法:

1
2
3
4
5
6
7
8
9
10
- (void)selectBuiltInMicrophone
{
    AVAudioSession *session = [AVAudioSession sharedInstance];
    for (AVAudioSessionPortDescription *port in session.availableInputs)
        if ([port.portType isEqualToString:AVAudioSessionPortBuiltInMic]) {
            NSError *error;
            [session setPreferredInput:port error:&error];
            break;
        }
}

通过调用上述方法,输入设备将从有线耳机的麦克风切换到iPhone的内置麦克风,而输出设备保持不受影响,因此iPhone将从内置麦克风录音并通过有线耳机播放。这就是我的期望。

问题是,当耳机为蓝牙耳机时,此方法不起作用。如果我将蓝牙耳机连接到iPhone,然后调用上述方法,则内置麦克风将成为输入设备,这很不错,但是输出设备也将更改为iPhone的接收器,这很糟糕。

看来蓝牙耳机的输入和输出已锁定在一起:您可以同时使用它们,也可以不使用它们。我的目标真的不可能吗?还是有一种方法可以克服明显的限制?


无法接收来自iPhone内置麦克风的音频输入,并不能同时通过Bluetooth耳机播放该音频

  • 有一种预防措施,您可以像对讲机那样使用。
  • 您必须创建两个会话。 意味着在录制音频时,您必须启用带有录音和播放功能的音频会话。
  • 在播放时,您必须将选项设置为audiosession(allowingBluetooth)。
  • 录制时您必须设置录制和播放。

  • 通过蓝牙音频设备播放音频时,可以选择特定的麦克风。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      // set audio session category to .playAndRecord. use do-catch if you need error-handling
      try? AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP, .allowBluetooth])

      // check if currentRoute is set to a bluetooth audio device
      let btOutputTypes: [AVAudioSession.Port] = [.bluetoothHFP, .bluetoothA2DP, .bluetoothLE]
      let btOutputs = AVAudioSession.sharedInstance().currentRoute.outputs.filter { btOutputTypes.contains($0.portType) }

      // if so, set preferred audio input to built-in mic
      if !btOutputs.isEmpty {
         let builtInMicInput = AVAudioSession.sharedInstance().availableInputs?.filter { $0.portType == .builtInMic }.first
         try? AVAudioSession.sharedInstance().setPreferredInput(builtInMicInput)
      } else {
         // set default input
         try? AVAudioSession.sharedInstance().setPreferredInput(nil)
      }

      try? AVAudioSession.sharedInstance().setActive(true)

    或者您可以按照此处的详细说明进行操作
    https://developer.apple.com/library/archive/qa/qa1799/_index.html