AVAudioSession 不会自动连接蓝牙 A2DP 音频?

Posted

技术标签:

【中文标题】AVAudioSession 不会自动连接蓝牙 A2DP 音频?【英文标题】:AVAudioSession does not automatically connect to Bluetooth A2DP audio? 【发布时间】:2020-12-13 13:18:37 【问题描述】:

说明:

当我通过以下调用将 Audiosession 更改为 .playAndRecord 时:

AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP, .mixWithOthers])

从这些类别选项集中,我希望,一旦我将蓝牙耳机与手机配对,我正在运行的应用程序应该会自动将音频路由到我的蓝牙 A2DP 耳机。相反,我的应用仍然选择使用手机扬声器。无论是通过查询音频会话实例还是以路由更改通知的形式,都没有任何迹象表明我连接了蓝牙耳机..

问题:如何确保音频会话自动连接到蓝牙耳机?

这种行为显然与不正确的代码行无关。就像我在调用音频会话类别更改之前配对了蓝牙耳机一样,我的音频将正确地继续使用蓝牙耳机。

此外,如果我在代码调用期间使用.allowBluetooth 类别选项(用于 HFP 而不是 A2DP),然后配对蓝牙耳机,耳机会自动连接正常。行为重现于:带有 Apple AirPods Pro 的 iPhone XR (iOS 13.6.1) 配备 Senso 无线 44.1kHz 蓝牙耳机的 iPhone XR (iOS 13.6)。

复制步骤:

为了方便 Apple 工程师和可重现性,我在 AVEchoTouch Demo Code from WWDC 的轻微修改版本上重现了该问题。由于这是 Apple 发布的一个演示项目,所以代码都是正确的。我修改后的项目名为BluetoothIssue,可以在here找到。

第 1 步:确保您的蓝牙耳机当前未与 iPhone 配对。

第 2 步:启动“BluetoothIssue 应用程序”。当您切换“FX Out”或“Speech Out”切换时,应用程序应该正在播放声音(从 iPhone 扬声器中)

第 3 步:现在将您的蓝牙耳机连接到手机。即使耳机现在已连接并与手机配对,应用程序也不会注册连接,并继续通过手机内置扬声器播放。

// 步骤 4-5(可选):查看应用的类别本身是否有问题

第 4 步:现在强制终止“BluetoothIssue”应用,同时您的耳机仍处于连接状态。

第 5 步:现在重新启动“BluetoothIssue”应用。该应用程序可以正确地向蓝牙耳机播放声音。

【问题讨论】:

【参考方案1】:

我了解到,如果我将模式设置为 VideoRecording,如果我打开蓝牙,iOS 将更改路由(并且我会收到路由更改通知)。如果没有这种模式,我必须允许两个蓝牙,在检测到一个之后,再次更改类别而不使用 AllowBluetooth,只是 A2DP。奇怪而缓慢的解决方案,但有效。现在我只是使用录像模式。

【讨论】:

所以你设法将手机麦克风与 A2DP BT 耳机一起用于“录像”模式? 如果您在已连接的情况下启动应用程序,则内置麦克风和 BT A2DP 耳机始终可以正常工作。但是,如果在应用程序打开后连接了 BT heaphone,则获得 AudioSession 通知的唯一方法是将会话设置为 videoRecording 模式。需要注意的是,在此模式下,某些 iPhone 可以将内置麦克风的数据源更改为另一个麦克风(例如,“底部”更改为“前”麦克风)。当然,如果您有必要,您可以手动恢复该更改。 @RogerioBelsa,谢谢。 Apple 将其标记为不是错误,这真的很烦人! 是的!此“修复”还有另一个小“问题”:根据手机的型号,它可以在视频录制模式下更改内置麦克风的来源(在我的情况下,从“顶部”更改为“底部” ) 如果你愿意,你可以把源改回来,但通常这没什么大不了的。

以上是关于AVAudioSession 不会自动连接蓝牙 A2DP 音频?的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioSession 未检测到连接的蓝牙设备

AVAudioPlayer 和 AVAudioSession 不会在 iPad(2 或其他)上播放蓝牙立体声

初始化 AVAudioSession 时保持蓝牙声音

iOS设置蓝牙外设播放音频

连接蓝牙耳机时无法切换到扬声器输出

为啥android6.0的手机不能连接蓝牙