我想知道我的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
通知?
答案 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可能会对您有所帮助。