通过蓝牙连接的扬声器播放

在我的应用程序中,我正在使用播放和logging类别:

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; CheckError( AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory), "Couldn't set audio category"); 

在应用程序中,任何播放的audio都将通过接收器初始输出,直到我设置为:

 UInt32 doChangeDefaultRoute = 1; AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute); 

然而,我真正想要的是audio通过连接的蓝牙扬声器输出。 例如,我有一个通过蓝牙连接的扬声器。 我可以通过原生音乐应用程序播放音乐。 但是,在我的应用程序使用playandrecord类时,它只能在设备上播放。 我努力了:

 UInt32 allowBluetoothInput = 1; OSStatus stat = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, sizeof (allowBluetoothInput), &allowBluetoothInput ); 

以及:

 CFStringRef audioRouteOverride = kAudioSessionOutputRoute_BluetoothHFP; OSStatus s = AudioSessionSetProperty (kAudioSessionProperty_OutputDestination, sizeof(audioRouteOverride),&audioRouteOverride); 

没有运气。 似乎这应该是一个简单的财产集,但Idk。 有任何想法吗?

如果有人也想搞清楚这是不可能的。 仔细看看所有可用的audio会话属性,你会发现这是事实

我想你是在想这个。 简单地设置第一部分,以允许蓝牙输出,然后确保你路由没有工作。

 UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride); 

我只是testing这个确切的事情。 然后在你的路由改变监听器中,你只需要担心别的东西,比如插入耳机。

这是可能的,但您的蓝牙设备必须是耳机或带有内置麦克风的蓝牙设备。 当您处于播放和logging类别时,它会强制您使用蓝牙麦克风作为input。 如果你没有蓝牙麦克风,它也不会播放蓝牙(如果你正在同时录音)。 另外请记住,当你录制和stream媒体到BT你只会得到8千赫单声道。

所以,首先你需要知道它是什么样的蓝牙设备。 无论是BluetoothHFP (input和输出), BluetoothA2DP (仅输出)还是BluetoothLE (仅限输出)。 如果设备仅输出,您将无法连接和路由kAudioSessionCategory_PlayAndRecord类别中的audio。 您可以尝试将类别设置为kAudioSessionCategory_PlayBack并查看是否可以使用。

我一个星期前遇到同样的问题。 我的应用程序需要input和输出,所以我必须将类别设置为kAudioSessionCategory_PlayAndRecord 。 所以我打算改变基于不同types的蓝牙设备的会话类别。