通过蓝牙连接扬声器播放

时间:2012-05-31 20:49:26

标签: ios core-audio

在我的应用程序中,我使用的是播放和录制类别:

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

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

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

然而我真正想要的是通过连接的蓝牙扬声器输出音频。例如,我有一个通过蓝牙连接的扬声器。我可以通过原生音乐应用程序播放音乐。但是在我的应用程序中使用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。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

这是可能的,但您的蓝牙设备必须是耳机或带有内置麦克风的蓝牙设备。当您处于playandrecord类别时,它会强制您使用蓝牙麦克风作为输入。如果您没有蓝牙麦克风,它也不会播放到蓝牙(如果您同时录制)。另外请记住,当您录制和流式传输到BT时,您只能获得8 khz mono。

答案 1 :(得分:1)

所以,首先你需要知道它是什么类型的蓝牙设备。是 BluetoothHFP (输入和输出), BluetoothA2DP (仅输出)还是 BluetoothLE (仅输出)。如果仅输出设备,则无法在 kAudioSessionCategory_PlayAndRecord 类别中连接和路由音频。您可以尝试将类别设置为 kAudioSessionCategory_PlayBack ,看看是否有效。

一周前我遇到了同样的问题。我的应用程序需要输入和输出,所以我必须将类别设置为 kAudioSessionCategory_PlayAndRecord 。所以我打算根据不同类型的蓝牙设备更改会话类别。

答案 2 :(得分:0)

如果有人也试图解决这个问题,那是不可能的。仔细查看所有可用的音频会话属性,您会发现这种情况

答案 3 :(得分:0)

我认为你过度思考了这一点。只需将第一部分设置为允许蓝牙输出,然后确保无法路由到无效。

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

我只是在测试这个问题。然后在你的路线改变听众中,你应该只需要担心别的东西,比如插入耳机。