我正在构建一个与物理蓝牙设备配合使用的闹钟应用程序。我需要将一个音频文件(从iTunes资料库中选择的一首歌)发送到内置扬声器,并将一个单独的音频文件同时发送到蓝牙设备(实际上是蓝牙HFP扬声器)。
我在完成此操作时的第一个想法是使用AVAudioSession
的新AVAudioSessionCategoryMultiRoute
,但iOS 7不会将我的扬声器检测为可能的路线;它会检测 内置扬声器或 HFP扬声器,但它不会同时检测到它们。检测两者都需要同时发送两个文件。
我的第二个想法是使用AVAudioSessionCategoryPlayAndRecord
(即使该应用不需要麦克风),并使用overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
和overrideOutputAudioPort:AVAudioSessionPortOverrideNone
,如下所示:
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"alarm"
ofType:@"m4a"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
self.bluetoothAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL
error:nil];
self.bluetoothAudioPlayer.delegate = self;
[self.bluetoothAudioPlayer play];
NSError *error = nil;
NSURL *selectedSongURL = [self.selectedSong valueForProperty:MPMediaItemPropertyAssetURL];
NSLog(@"selectedSongURL: %@", selectedSongURL);
if (selectedSongURL) {
if (![[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]) {
NSLog(@"overrideOutput error: %@", error);
}
self.internalAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:selectedSongURL error:nil];
self.internalAudioPlayer.delegate = self;
[self.internalAudioPlayer play];
}
此警报静音后,我运行[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];
重设覆盖电话。
然而,这不起作用,因为iOS只是将两个音频信号放在同一个扬声器上。
有没有办法将一个音频流发送到蓝牙HFP扬声器,将另一个音频流发送到内置扬声器?