我正在尝试在IOS 8.0 AVAudioSessionSilenceSecondaryAudioHintNotification
中使用新的通知调用,这样当其他背景音频(如系统音乐播放器)播放停止/启动时,我可以相应地播放/暂停我的iPad应用音乐效果将继续,并与应用程序或背景音乐混合)。当我没有播放任何音乐时,我会正确收到通知。然而,当我使用AVAudioPlayer
来实际播放我的应用音乐时,通知从未被调用(我正在使用我的耳塞上的遥控器启动和停止系统音乐进行测试)。
如果我切换到使用音频会话类别AVAudioSessionCategoryAmbient
,它的行为正常并发送通知,但我需要使用类别AVAudioSessionCategoryPlayAndRecord
,因为我在应用期间也在录制。
我发现默认情况下AVAudioSessionCategoryPlayAndRecord
是不可混合的,人们不会指望它的行为类似于AVAudioSessionCategoryAmbient
,但我正在设置类别AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionMixWithOthers
,所以我的播放/录制音频会话应该像AVAudioSessionCategoryAmbient
一样可混合。我希望AVAudioSessionSilenceSecondaryAudioHintNotification
可以在这种情况下工作。
我想知道是否有人在应用AVAudioSessionSilenceSecondaryAudioHintNotification
游戏期间让AVAudioPlayer
成功运作
AVAudioSessionCategoryPlayAndRecord
+ withOptions:AVAudioSessionCategoryOptionMixWithOthers
谢谢!我希望这个问题足够具体,我很想在StackOverflow上发帖。
编辑:添加一些代码示例(虽然我知道此代码确实有效,但结果只会因音频会话类别/选项而异。)
这是在app delegate的didFinishLaunchingWithOptions的音频init中调用的 设置背景通知(例如系统播放器)音频状态更改:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleOtherAudioStatusChanged:)
name:AVAudioSessionSilenceSecondaryAudioHintNotification
object:[AVAudioSession sharedInstance]];
这是通知回调
-(void)handleOtherAudioStatusChanged:(id)notification {
#if DEBUG_MODE
NSLog(@"handleOtherAudioStatusChanged notification");
#endif
NSNotification *n = (NSNotification *)notification;
NSDictionary *interuptionDict = n.userInfo;
if(interuptionDict && (n.name == AVAudioSessionSilenceSecondaryAudioHintNotification)) {
// Get the AVAudioSessionInterruptionTypeKey enum from the dictionary
NSInteger hintType = [[interuptionDict valueForKey:AVAudioSessionSilenceSecondaryAudioHintTypeKey] integerValue];
// Decide what to do based on interruption type...
switch(hintType) {
case(AVAudioSessionSilenceSecondaryAudioHintTypeBegin): {
// OTHER AUDIO STARTED
// The system is indicating that another application's primary audio has started
#if DEBUG_MODE
NSLog(@"In handleOtherAudioStatusChanged, other background audio started, stop game music if enabled/playing");
#endif
// TEST AND STOP GAME MUSIC IF NEEDED
break;
} // end case
case(AVAudioSessionSilenceSecondaryAudioHintTypeEnd): {
// OTHER AUDIO STOPPED
// The system is indicating that another application's primary audio has stopped
#if DEBUG_MODE
NSLog(@"In handleOtherAudioStatusChanged, other background audio stopped, play game music if enabled/during game");
#endif
// TEST AND START GAME MUSIC IF NEEDED
break;
}// end case
} // end switch
}
}
此音频会话类别一直有效,而我的应用正在播放音乐:
[audioSession setCategory:AVAudioSessionCategoryAmbient
error:&setCategoryError];
这仅适用于我的应用不播放音乐的情况。随着 withOptions覆盖,这应该像AVAudioSessionCategoryAmbient一样混合,所以我很惊讶:
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:&setCategoryError];
我也试过这个只是为了测试而且它只在我的应用不播放音乐时才有用。但是这个覆盖选项也可以混合......
[audioSession setCategory:AVAudioSessionCategoryPlayback
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:&setCategoryError];
我正在进行音频会话setCategory / setMode / setActive in:
didFinishLaunchingWithOptions
(音频初始化)didBecomeActive
我的应用音乐使用AVAudioPlayer
appMusicPlayer播放;
self.appMusicPlayer.numberOfLoops = AFCAudioLoopForever;
[self.appMusicPlayer prepareToPlay];
[self.appMusicPlayer play];
我有其他AVAudioPlayer
用于其他非常简短的声音效果,并且一些测试表明,在我之前提到的类别/选项中,播放它们时也会干扰AVAudioSessionSilenceSecondaryAudioHintNotification
。
希望有所帮助。