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

标签 ios audio bluetooth core-audio avaudiosession

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

我正在尝试使蓝牙耳机与该应用程序配合使用,但是我注意到将BT与不同的AVAudioSession类别配对时存在一些特殊之处:

如果我使用AVAudioSessionCategoryAmbient,则在应用程序运行时或在应用程序启动之前,可以将BT耳机配对/取消配对很好。配对或取消配对耳机时,我也可以接收AVAudioSessionRouteChangeNotification

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

如果将应用程序移至后台然后重新输入,我可以使BT工作,但是当应用程序处于前台时,我永远无法配对。

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

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

 //enable bluetooth
 [PdAudioController setSessionOptions:AVAudioSessionCategoryOptionAllowBluetoothA2DP];

使用AVAudioSessionCategoryPlayAndRecord时,我还能更改一些其他设置以在应用程序运行时配对耳机吗?

最佳答案

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

当应用停止音频 session 进入后台,然后又重新进入前景时,此间隙使音频 session 和音频单元代码可以重新协商采样率(例如,建议并处理失败/错误代码,- 50(等),然后才能(重新)启用 session 并(重新)启动音频单元。

如果您收到路线更改通知,则可以尝试让该应用停止音频,关闭其 session ,等待几分钟,然后根据需要重新启动任何音频。

关于ios - 应用程序运行时无法将蓝牙耳机与AVAudioSessionCategoryPlayAndRecord连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013041/

相关文章:

python - 在python(tkinter)中播放声音时执行按键事件

c# - 蓝牙和 C# PC -> 无需配对的手机连接

ios - 蓝牙数据更新通知未被触发

ios - 从 Swift 函数中的异步调用返回数据

javascript - 在 React Native 上使用 require 而不是 import 时出现红屏

ios - 当主线程被阻塞时,MBProgressHUD 没有及时显示

android - 当一个人靠近距离传感器时如何播放重复的音频,而当他离开时如何停止

javascript - 在 safari 上滚动,Jquery 对话框无法正常工作

ios - 具有 kAudioUnitType_Output 和 kAudioUnitSubType_RemoteIO 的音频单元默认使用低切滤波器吗?

android - 为什么连接到由 createRfcommSocket 创建的套接字比 createInsecureRfcommSocketToServiceRecord 更快?