繁体   English   中英

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

[英]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有效地防止在调用应用程序的音频处理程序时使用外部音频源。

处理媒体中断问题的一种方法可能是收听MPMusicPlayerControllerplaybackState ,如此stackoverflow问题所示: 检测音乐是否正在播放?


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

通过在InterruptionTypeBegan时重新调用音频组件来完全阻止外部音频InterruptionTypeBegan

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


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

如果您还没有,请尝试将AVCaptureSession的属性usesApplicationAudioSessionNO

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

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

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

如果你想在中断之前和之后加入文件,这个问题的答案: AVAudioRecorder只在中断后记录音频可能对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM