如何同时使用蓝牙麦克风和内置扬声器



我正在尝试在iOS中实现一项非常简单的任务。我想从蓝牙麦克风获取音频,并使用内置扬声器同时播放音频。

这是我现在的东西。该应用程序允许用户选择扬声器和麦克风源。然而,每当我选择内置扬声器时,应用程序都会切换到内置麦克风。每当我拿起蓝牙麦克风时,应用程序都会使用蓝牙扬声器。我无法单独使用蓝牙麦克风和内置扬声器。

import UIKit
import AVFoundation
import AVKit
class ViewController: UIViewController {
var engine = AVAudioEngine()
let player = AVAudioPlayerNode()
let audioSession = AVAudioSession()
var routePickerView = AVRoutePickerView(frame: CGRect(x: 0, y: 0, width: 0, height: 50))
let bus = 0
var isRunning = false
@IBOutlet weak var viewHolder: UIStackView!
override func viewDidLoad() {
super.viewDidLoad()
setUpAVRoutePicker()
setUpAVSession()
}
func setUpAVRoutePicker() {
viewHolder.addArrangedSubview(routePickerView)
}
func setUpAVSession() {
do {
try audioSession.setCategory(AVAudioSession.Category.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP, .allowAirPlay])
try audioSession.setMode(AVAudioSession.Mode.default)
try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
try audioSession.setActive(true)
} catch {
print("Error setting up AV session!")
print(error)
}
}
@IBAction func start(_ sender: AnyObject) {
isRunning = !isRunning
sender.setTitle(isRunning ? "Stop" : "Start", for: .normal)
if isRunning {
engine.attach(player)
let inputFormat = engine.inputNode.inputFormat(forBus: bus)
engine.connect(player, to: engine.mainMixerNode, format: inputFormat)
engine.inputNode.installTap(onBus: bus, bufferSize: 512, format: inputFormat) { (buffer, time) -> Void in
self.player.scheduleBuffer(buffer)
}
do {
try engine.start()
} catch {
print("Engine start error")
print(error)
return
}
player.play()
} else {
engine.inputNode.removeTap(onBus: bus)
engine.stop()
player.stop()
}
}
@IBAction func onInputBtnClicked(_ sender: AnyObject) {
let controller = UIAlertController(title: "Select Input", message: "", preferredStyle: UIAlertController.Style.actionSheet)
for input in audioSession.availableInputs ?? [] {
controller.addAction(UIAlertAction(title: input.portName, style: UIAlertAction.Style.default, handler: { action in
do {
try self.audioSession.setPreferredInput(input)
} catch {
print("Setting preferred input error")
print(error)
}
}))
}
present(controller, animated: true, completion: nil)
}

}

似乎不可能做到这一点(https://stackoverflow.com/a/24519938/6308776),这有点疯狂。我知道在安卓系统上可以完成这么简单的任务,但在iOS系统上似乎不可能。有人有什么想法吗?

p/s:我想使用蓝牙耳机,我不想通过wifi进行传输。

来自苹果:

https://forums.developer.apple.com/thread/62954

。。。如果应用程序正在使用setPreferredInput选择蓝牙HFP输入,输出应自动更改为蓝牙与该输入相对应的HFP输出。此外,选择使用MPVolumeView的路由选择器的蓝牙HFP输出应该自动将输入更改为蓝牙HFP输入与该输出相对应。换句话说,输入和输出应始终位于所选的同一蓝牙HFP设备上对于输入/输出,即使只设置了输入或输出单独。这是预期的行为,但如果没有发生我们当然想知道。

最新更新