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耳机播放该音频
通过蓝牙音频设备播放音频时,可以选择特定的麦克风。
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