我有一个播放录制音频和重复声音的应用。通过板载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应用程序的蓝牙音频输出有一个特定的问题。
答案 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设备上结束。