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

时间:2014-01-23 16:44:47

标签: ios objective-c ipad avaudioplayer avaudiosession

我有一个播放录制音频和重复声音的应用。通过板载iPad扬声器可以正常播放声音,如果我从耳机插孔插入一根线到我的立体声音频输入,它也能很好地播放。当我将iPad与我的蓝牙立体声输入配对时,我的其他应用程序(为iPhone编写,在我的iPad上运行)发出的所有声音都能正常工作,就像我设备上的所有其他声音一样。

问题是我为iPad编写的应用程序不是通过蓝牙路径播放,而是通过内置扬声器播放。

在didFinishLaunchingWithOptions(...)方法的app委托中,我放置了以下内容:

NSError *error = nil;
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:&error];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];

正在调用此代码,并且不会返回任何错误。

在我的控制器代码中,我记录了使用AVAudioPlayer播放的样本,如下所示:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordURL error:&error];
audioPlayer.numberOfLoops = 0;
[audioPlayer setDelegate:self];
[audioPlayer play];

在其他方面,我的无人机播放时间短。在线程控制的循环中重复播放了01秒的声音,我使用OpenAL执行此操作:

    alSourcePlay(sourceID);

这与我为iPhone编写的其他应用程序中的代码相同。

我意识到蓝牙输入还有其他线程,但我的iPad应用程序的蓝牙音频输出有一个特定的问题。

4 个答案:

答案 0 :(得分:2)

由于您的类别是播放和录制,您必须启用蓝牙作为输入才能支持它作为输出(默认情况下,相同的接收器用于播放和录制模式下的输入/输出)。为此,您必须在AVAudioSession上设置一个额外的属性:

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

您还需要检查是否通过在会话中设置kAudioSessionProperty_OverrideCategoryDefaultToSpeaker属性来强制输出到代码中任何位置的内置扬声器。

答案 1 :(得分:2)

这是目前的解决方案,但已被弃用,任何人都知道新的解决方案,但现在在您的应用上添加这部分代码并且一切正常![/ p>

 UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

希望这对你有帮助!

答案 2 :(得分:1)

您是否使用setOategory withOptions检查?它从iOS 6开始

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error];

答案 3 :(得分:1)

不可能。

来自非常有趣的Apple doc AVAudioSession - 选择麦克风QA1799:

如果应用程序使用setPreferredInput:error:方法选择蓝牙HFP输入,则输出将自动更改为蓝牙HFP输出。此外,使用MPVolumeView的路由选择器选择蓝牙HFP输出将自动将输入更改为蓝牙HFP输入。因此,即使只是单独设置输入或输出,输入和输出也总是在蓝牙HFP设备上结束。