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

时间:2012-07-26 19:42:06

标签: ios avplayer avaudiosession ios6.0

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

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

5 个答案:

答案 0 :(得分:8)

在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加载到适当的时间。

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

答案 1 :(得分:4)

我可以确认使用C api,中断开始时也不会调用中断方法;只有当它结束时

(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self));

我还为此问题向苹果提交了一份错误报告。

编辑:这已在iOS 6.1(但不是iOS 6.0.1)中修复

答案 2 :(得分:2)

请致电:

[[AVAudioSession sharedInstance] setDelegate: self];

答案 3 :(得分:0)

我刚刚通过在AudioSessionInitialize()中声明的AudioSessionInterruptionListener回调函数中设置断点来检查我的iPhone 5(运行iOS 6.0),并且当应用程序具有活动音频时,此中断回调实际上会被调用会话和音频单元,并通过拨入电话中断(Xcode显示应用程序在中断开始时在断点处停止,然后我继续)。

我有应用程序然后停止其音频单元并取消激活其音频会话。然后,在结束中断回调时,应用程序重新激活音频会话并重新启动音频单元而没有问题(应用程序之后正确录制音频)。

答案 4 :(得分:0)

我在iOS 6.0.x上构建了一个全新的音频流(AVPlayer)应用程序并发现了同样的问题。

代表现已弃用,我们必须使用通知,这很好,但这是我的发现:

  1. 在来电期间,我的处理程序中只有AVAudioSessionInterruptionTypeEnded以及AVAudioSessionInterruptionOptionShouldResume。音频会话自动暂停(音频淡入淡出),我只需要恢复AVPlayer
  2. 的播放
  3. 然而,当尝试启动游戏时,例如CSR Racing,我奇怪地得到了可怕的AVAudioSessionInterruptionTypeBegan,但是当我的应用程序可以恢复播放时没有任何迹象,甚至没有杀死游戏。
  4. 现在,这可能取决于其他因素,例如我的音频类别(在我的情况下为AVAudioSessionCategoryPlayback)和两个应用程序的混合设置(kAudioSessionProperty_OverrideCategoryMixWithOthers),我不确定,但绝对是我看到一些不合适的东西。

    希望其他人报告说在6.1beta上这是固定的,我还要升级,所以我们会看到。