应用程序运行时无法将蓝牙耳机与 AVAudioSessionCategoryPlayAndRecord 连接

Posted

技术标签:

【中文标题】应用程序运行时无法将蓝牙耳机与 AVAudioSessionCategoryPlayAndRecord 连接【英文标题】:Unable to connect Bluetooth headset with AVAudioSessionCategoryPlayAndRecord while app is running 【发布时间】:2018-08-25 00:13:31 【问题描述】:

我正在开发一个需要麦克风输入的音乐应用,所以我的AVAudiosessionCategory 设置为AVAudioSessionCategoryPlayAndRecord

我正在尝试让蓝牙耳机与该应用程序配合使用,但我注意到将 BT 与不同的AVAudioSession 类别配对时有些奇怪:

如果我使用AVAudioSessionCategoryAmbient,BT 耳机在应用程序运行时或在应用程序启动之前配对/取消配对正常。我也可以在配对或取消配对耳机时收到AVAudioSessionRouteChangeNotifications。

但是,使用AVAudioSessionCategoryPlayAndRecord,如果我在应用程序启动之前配对它,我可以与 BT 配对并接收音频,但如果我在应用程序运行时尝试配对,它将无法工作。我的 BT 耳机会显示它们已“连接”,但 BT 图标不会出现在 iOS 状态栏上。我在打开或关闭耳机时也没有收到任何类型的 AVAudioSessionRouteChangeNotifications 或其他音频中断通知。

如果我将应用程序移到后台然后重新进入,我可以让 BT 正常工作,但是当应用程序在前台时我永远无法配对。

我将 libpd 用于音频引擎,这是我初始化 PdAudioController 对象的方法:

 [self.pdAudio configurePlaybackWithSampleRate:samplingRate numberChannels:2 inputEnabled:YES mixingEnabled:NO];

 //enable bluetooth
 [PdAudioController setSessionOptions:AVAudioSessionCategoryOptionAllowBluetoothA2DP];

在使用AVAudioSessionCategoryPlayAndRecordAVAudioSessionCategoryPlayAndRecord时,我是否可以更改其他设置以在应用运行时配对耳机?

【问题讨论】:

你的BT耳机支持录音吗?他们有麦克风吗? 是的,他们确实有一个麦克风,我可以用它来通话/录音,但我刚刚做了一个测试,即使他们配对并且正在输出声音,BT 麦克风似乎也没有激活通过 BT 耳机(更高的输入电平是从 iPhone 麦克风而不是 BT 麦克风录制的)。你认为这有什么关系吗?接收输入的位置对我来说并不重要(我的应用程序分析来自现场乐器的音频),但重要的是您不能在应用程序运行时配对 BT,仅在使用 @987654333 时 @. 重新使用 BT 麦克风,AVAudioSessionCategoryOptionAllowBluetooth 有帮助吗?我只是猜测,我不能添加太多 - 你尝试过@hotpaw2 的建议吗? AVAudioSessionCategoryOptionAllowBluetooth 与libpd 一起使用会导致音频和点击卡顿,而AVAudioSessionCategoryOptionAllowBluetoothA2DP 可以正常工作,只要您在启动应用程序之前已经与BT 配对。这可能是我应该向libpd 开发人员提出的问题,因为他们似乎没有在这方面进行大量测试:github.com/libpd/libpd/issues/177github.com/libpd/libpd/issues/245 你试过其他BT设备吗? 【参考方案1】:

许多蓝牙耳机似乎仅限于特定的采样率集,有时输入(麦克风)和输出(扬声器)的采样率不同。因此他们无法连接到采样率不兼容的实时音频会话。

当应用停止其音频会话以转到后台,然后重新进入前台时,此间隙允许音频会话和音频单元代码重新协商采样率(例如,建议和处理失败/错误代码、-50 等)在(重新)启用会话和(重新)启动音频单元之前。

如果您收到路线更改通知,您可以尝试让应用停止音频,关闭其会话,等待几个滴答声,然后根据需要重新启动任何音频。

【讨论】:

有趣的是,我正在关闭路由更改通知中的音频,重新配置音频单元以根据连接的内容以首选采样率播放,然后重新打开音频。然而奇怪的是,当我在应用程序运行时打开耳机时,永远不会发送路线更改通知。如果我在启动应用程序之前已经与 BT 连接,我在应用程序运行时关闭 BT 时收到通知。 hmmm... 应用程序可能不会收到与当前会话不兼容的设备的通知?您可能必须让用户(少数阅读应用文档的人)手动切换。

以上是关于应用程序运行时无法将蓝牙耳机与 AVAudioSessionCategoryPlayAndRecord 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何永远在后台运行需要蓝牙的应用程序?

荣耀手表ES与运动健康App蓝牙连接自动断开或无法自动重连?

k380连接电脑驱动程序错误怎么办?

蓝牙连接;无法正确发送字符串

系统声音服务连接到汽车的蓝牙时不会播放音频

PC 无法发现 J2ME 蓝牙服务