iOS AVAudioSession中断通知无法按预期工作

时间:2015-08-04 09:56:38

标签: ios avfoundation interrupt avaudiorecorder avaudiosession

我想知道我的AVAudioRecorder何时无法访问(例如音乐开始播放时)。

由于{9}将在iOS 9中弃用,我会关注audioRecorderEndInterruption的中断通知(但两者都没有按预期工作)。

问题是如果应用程序在中断发生时仍然在前台,则永远不会调用中断通知。

例如:用户无需将应用程序移至后台即可开始和停止播放音乐。

检测我正在使用的任何中断:

AVAudioSession

我按预期得到[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; ... - (void)audioSessionWasInterrupted:(NSNotification *)notification { if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) { NSLog(@"Interruption notification"); if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) { NSLog(@"InterruptionTypeBegan"); } else { NSLog(@"InterruptionTypeEnded"); } } } ,但如果应用仍处于前台,则InterruptionTypeBegan不会被调用(意味着在应用被放入应用之前不会被调用背景并回到前台)。

当应用在前台时发生中断时,如何收到InterruptionTypeEnded通知?

3 个答案:

答案 0 :(得分:5)

这是影响使用AV框架组件的任何应用程序的普遍问题(本机iOS应用程序也是如此)。

正如's documentation中有关音频中断问题的解释,InterruptionTypeEnded实际上应该适用于上述情景:

  

如果用户解除了中断......系统会调用您的回调方法,表明中断已经结束。

但是,它还声明可能根本不会调用InterruptionTypeEnded

  

无法保证开始中断会导致结束中断。

因此,在上述场景中需要采用不同的方法。

在处理音乐中断时,问题不会长久存在。 iOS 9有效地防止在调用应用程序的音频处理程序时使用外部音频源。

处理媒体中断问题的方法可能是收听MPMusicPlayerController playbackState,如此stackoverflow问题所示:Detecting if music is playing?

处理中断问题的更直接方法是:

InterruptionTypeBegan时重新调用音频组件,完全阻止外部音频中断。

或者通过提供外部媒体源中断音频会话的UI指示(例如显示非活动麦克风)。

希望能为这个问题找到更好的解决方案,但与此同时,这应该会为您提供解决中断问题的一些选择。

答案 1 :(得分:-1)

如果您还没有,请尝试将AVCaptureSession的属性usesApplicationAudioSession设置为

This问题&如果您正在寻找更多细节,答案可能是一个很好的参考。

答案 2 :(得分:-1)

我试试这个并发现在某些应用中音乐暂停后可能会调用InterruptionTypeEnded,但暂停时不会调用其他内容。

我的解决方案是更新UI以让用户知道记录已停止并执行一些相关工作,例如文件操作。当中断结束时,活动AVAudioSession,如果没有错误,则启动新记录。

如果您想在中断之前和之后加入该文件,这个问题的答案:AVAudioRecorder records only the audio after interruption可能会对您有所帮助。