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

Ios 如何同时使用蓝牙麦克风和内置扬声器?,ios,swift,iphone,bluetooth,microphone,Ios,Swift,Iphone,Bluetooth,Microphone,我试图在iOS中实现一个非常简单的任务。我想从蓝牙麦克风获取音频,并使用内置扬声器同时播放音频 这是我现在拥有的。该应用程序允许用户选择扬声器和麦克风源。但是,每当我选择内置扬声器时,应用程序都会切换到内置麦克风。每当我拿起蓝牙麦克风时,应用程序都会使用蓝牙扬声器。我无法单独使用蓝牙麦克风和内置扬声器 导入UIKit 进口AVF基金会 进口AVKit 类ViewController:UIViewController{ var引擎=AVAudioEngine() 让player=AVAudioPl

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

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

导入UIKit
进口AVF基金会
进口AVKit
类ViewController:UIViewController{
var引擎=AVAudioEngine()
让player=AVAudioPlayerNode()
让audioSession=AVAudioSession()
var routePickerView=AVRoutePickerView(帧:CGRect(x:0,y:0,宽度:0,高度:50))
让总线=0
var isRunning=false
@IBVAR视图持有者:UIStackView!
重写func viewDidLoad(){
super.viewDidLoad()
setUpAVRoutePicker()
setUpAVSession()
}
func setUpAVRoutePicker(){
viewHolder.addArrangedSubview(routePickerView)
}
func setUpAVSession(){
做{
尝试audioSession.setCategory(AVAudioSession.Category.playAndRecord,选项:[.defaultToSpeaker、.allowBluetooth、.allowBluetoothA2DP、.allowAirPlay])
尝试audioSession.setMode(AVAudioSession.Mode.default)
尝试audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
尝试audioSession.setActive(真)
}抓住{
打印(“设置AV会话时出错!”)
打印(错误)
}
}
@iAction func启动(\发送方:AnyObject){
isRunning=!isRunning
sender.setTitle(正在运行?“停止”:“开始”,用于:。正常)
如果正在运行{
引擎。连接(播放器)
让inputFormat=engine.inputNode.inputFormat(forBus:bus)
engine.connect(播放器,收件人:engine.mainMixerNode,格式:inputFormat)
installTap(onBus:bus,bufferSize:512,format:inputFormat){(buffer,time)->Void in
self.player.scheduleBuffer(缓冲区)
}
做{
试试引擎启动()
}抓住{
打印(“发动机启动错误”)
打印(错误)
返回
}
player.play()
}否则{
engine.inputNode.removeTap(onBus:bus)
引擎停止()
player.stop()
}
}
@iAction函数OnInputBtcled(\发送方:AnyObject){
让控制器=UIAlertController(标题:“选择输入”,消息:,首选样式:UIAlertController.Style.actionSheet)
用于audioSession.availableInputs中的输入???[]{
addAction(UIAlertAction)(标题:input.portName,样式:UIAlertAction.style.default,处理程序:{action in
做{
尝试self.audioSession.setPreferredInput(输入)
}抓住{
打印(“设置首选输入错误”)
打印(错误)
}
}))
}
存在(控制器,动画:真,完成:无)
}
}
似乎不可能做到这一点(),这有点疯狂。我知道在安卓系统上实现如此简单的任务是可能的,但在iOS系统上似乎是不可能的。有人有什么想法吗

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

来自苹果:

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

来自苹果:

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


有没有什么方法可以在不使用音频会话的情况下实现预期的行为?这些方法可能会帮助你:你以前有没有尝试过类似的方法?iOS也可以吗?我使用的每个实现都是有意地将输入与输出配对。看起来确实有一个硬件抽象层可以让您更改它,但即使它可以将它们分配到一起。有没有什么方法可以在不使用AVAudioSession的情况下实现预期的行为?这些可能会帮助您:您以前尝试过类似的方法吗?iOS也可以吗?我使用的每个实现都是有意地将输入与输出配对。看起来确实有一个硬件抽象层,可以让您更改它,但即使是它也可以将它们分配到一起。