[英]iOS AVAudioSession interruption notification not working as expected
我想知道我的AVAudioRecorder
无法访问(例如音乐开始播放时)。
由于audioRecorderEndInterruption
将在iOS 9中弃用,我将重点关注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
(这意味着在应用程序放置在后台并返回到前台之前不会调用它)。
当应用程序在前台时发生中断时,如何收到InterruptionTypeEnded
通知?
这是影响使用AV
框架组件的任何应用程序的普遍问题(本机iOS应用程序也是如此)。
正如关于音频中断主题的文档中所述, InterruptionTypeEnded
实际应该应用于上述场景:
如果用户解除了中断......系统会调用您的回调方法,表明中断已经结束。
但是,它还声明可能根本不会调用InterruptionTypeEnded
:
无法保证开始中断会导致结束中断。
因此,在所提到的场景中需要不同的方法。
在处理音乐中断时,问题不会持续很长时间。 iOS 9有效地防止在调用应用程序的音频处理程序时使用外部音频源。
处理媒体中断问题的一种方法可能是收听MPMusicPlayerController
的playbackState
,如此stackoverflow问题所示: 检测音乐是否正在播放? 。
处理中断问题的更直接方法是:
通过在InterruptionTypeBegan
时重新调用音频组件来完全阻止外部音频InterruptionTypeBegan
。
或者通过给出外部媒体源中断音频会话的UI指示(例如显示非活动麦克风)。
希望能为这个问题找到更好的解决方案,但与此同时,这应该为您提供一些解决中断问题的方案。
如果您还没有,请尝试将AVCaptureSession
的属性usesApplicationAudioSession
为NO 。
如果您正在寻找更多细节, 这个问题和答案可能是一个很好的参考。
我试试这个并发现InterruptionTypeEnded可能会在某个应用程序中音乐暂停后调用,但其他未在暂停时调用。
我的解决方案是更新UI以让用户知道记录已停止并执行一些相关工作,例如文件操作。 当中断结束时,活动AVAudioSession, 如果没有错误 ,则启动新记录。
如果你想在中断之前和之后加入文件,这个问题的答案: AVAudioRecorder只在中断后记录音频可能对你有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.