AVAudioSessionDelegate在endInterruption处调用,但未调用beginInterruption

far*_*ski 12 ios avaudiosession avplayer ios6.0

当应用程序启动并将委托设置为appDelegate时,我正在设置AVAudioSession.一切似乎都在工作(播放等),除了当电话接到电话时没有调用委托上的beginInterruption.当呼叫结束时,会调用endInterruption.

我唯一的想法是我以前使用的音频播放器代码基于AVAudioPlayer,但现在使用的是AVPlayer.用于处理中断的AVAudioPlayer委托的回调仍在那里,但它们以任何方式发生冲突似乎很奇怪.

Dav*_*ton 8

查看标题,在iOS6中,看起来AVAudioSessionDelegate现在已被弃用.

AVAudioSessionInterruptionNotification在iOS6中使用.

更新:这不起作用.我认为框架中存在一个错误.

是的,根据我的经验,beginInterruption,新记录的AVAudioSessionInterruptionNotification也不能正常工作.我要做的是使用本地标志跟踪播放器的状态,然后处理该endInterruption:withFlags:方法以跟踪从中断恢复.

使用iOS 6,从中断恢复将至少使您的AudioPlayer保持在正确的位置,因此我无需存储我的AVAudioPlayer的最后已知播放时间,我只需要播放.

这是我提出的解决方案.如果AVPlayer驻留时间太长,iOS 6似乎会通过媒体重置来杀死您的音频.最终发生的事情是AVPlayer播放,但没有声音出来.AVPlayer的速率是1,但绝对没有声音.为了增加这种情况的痛苦,AVAudioSession setActive和AVPlayer本身都没有错误,表明存在问题.

此外,您不能依赖appWillResignActive这一事实,因为如果您依赖远程控制手势,您的应用可能已经在后台.

我实现的最终解决方案是在AVPlayer上添加一个定期观察器,并记录最后的已知时间.当我收到我已经给予回控制的事件时,我创建一个新的AVPlayer,用AVPlayerItem加载它,并将seekToTime加载到适当的时间.

这是一个非常烦人的解决方法,但至少它可以工作,并避免发生的周期性崩溃.