当应用程序启动并将委托设置为appDelegate时,我正在设置AVAudioSession . 一切似乎都在工作(播放等),除了当电话接到电话时没有调用委托上的beginInterruption . 当呼叫结束时,正在调用endInterruption .
我唯一的想法是我以前使用的音频播放器代码基于AVAudioPlayer,但现在使用的是AVPlayer . 用于处理中断的AVAudioPlayer委托的回调仍在那里,但它们以任何方式发生冲突似乎很奇怪 .
当应用程序启动并将委托设置为appDelegate时,我正在设置AVAudioSession . 一切似乎都在工作(播放等),除了当电话接到电话时没有调用委托上的beginInterruption . 当呼叫结束时,正在调用endInterruption .
我唯一的想法是我以前使用的音频播放器代码基于AVAudioPlayer,但现在使用的是AVPlayer . 用于处理中断的AVAudioPlayer委托的回调仍在那里,但它们以任何方式发生冲突似乎很奇怪 .
5 回答
查看 Headers ,在iOS6中,看起来AVAudioSessionDelegate现在已被弃用 .
在iOS6中使用
AVAudioSessionInterruptionNotification
.更新:这不起作用 . 我认为框架中存在一个错误 .
是的,根据我的经验,beginInterruption,新记录的AVAudioSessionInterruptionNotification也不能正常工作 . 我必须做的是使用本地标志跟踪播放器的状态,然后处理
endInterruption:withFlags:
方法以跟踪从中断恢复 .使用iOS 6,从中断恢复将至少使您的AudioPlayer保持在正确的位置,因此我无需存储我的AVAudioPlayer的最后已知播放时间,我只需要播放 .
这是我提出的解决方案 . 如果AVPlayer驻留时间太长,iOS 6似乎会通过媒体重置来杀死您的音频 . 最终发生的事情是AVPlayer播放,但没有声音出来 . AVPlayer的速率是1,但绝对没有声音 . 为了增加这种情况的痛苦,AVAudioSession setActive和AVPlayer本身都没有错误,表明存在问题 .
此外,您不能依赖appWillResignActive这一事实,因为如果您依赖远程控制手势,您的应用可能已经在后台 .
我实现的最终解决方案是在AVPlayer上添加一个定期观察器,并记录最后的已知时间 . 当我收到我已经给予回控制的事件时,我创建一个新的AVPlayer,用AVPlayerItem加载它,并将seekToTime加载到适当的时间 .
这是一个非常烦人的解决方法,但至少它可以工作,并避免发生的周期性崩溃 .
我可以确认使用C api,中断开始时也不会调用中断方法;只有当它结束
我还为此问题向苹果提交了一份错误报告 .
Edit: 这已在iOS 6.1中修复(但不是iOS 6.0.1)
只需致电:
我刚刚通过在AudioSessionInitialize()中声明的AudioSessionInterruptionListener回调函数中设置断点来检查我的iPhone 5(运行iOS 6.0),并且当应用程序具有活动的音频会话和音频时,实际上会调用此中断回调单位并被来电打断(Xcode显示应用程序在中断开始时在断点处停止,然后我继续) .
我有应用程序然后停止其音频单元并取消激活其音频会话 . 然后,在结束中断回调时,应用程序重新激活音频会话并重新启动音频单元而没有问题(应用程序之后正确录制音频) .
我在iOS 6.0.x上构建了一个全新的音频流(
AVPlayer
)应用程序并发现了同样的问题 .代表现已弃用,我们必须使用通知,这很好,但这是我的发现:
在来电期间,我的处理程序中只有
AVAudioSessionInterruptionTypeEnded
和AVAudioSessionInterruptionOptionShouldResume
. 音频会话自动暂停(音频淡入淡出),我只需要恢复AVPlayer
的播放 .然而,当尝试启动游戏时,例如CSR Racing,我奇怪地得到了可怕的
AVAudioSessionInterruptionTypeBegan
但当我的应用程序可以恢复播放时没有任何迹象,甚至没有杀死游戏 .现在,这可能取决于其他因素,例如我的音频类别(在我的情况下是
AVAudioSessionCategoryPlayback
)和两个应用程序的混合设置(kAudioSessionProperty_OverrideCategoryMixWithOthers
),我不确定,但我肯定看到一些不合适的地方 .希望其他人报告说,在6.1beta这是固定的,我还需要升级,所以我们会看到 .