多任务处理后 AVAudioPlayer 继续播放

Posted

技术标签:

【中文标题】多任务处理后 AVAudioPlayer 继续播放【英文标题】:AVAudioPlayer Keeps Playing After Multitasking 【发布时间】:2011-06-19 15:21:33 【问题描述】:

我有一个应用程序可以在游戏期间在后台播放音乐,它支持多任务处理。当我按下主页按钮时,会在 applicationWillResignActive 上调用一个操作。这会拉起暂停屏幕并暂停游戏。但是,当我在游戏中实现音乐时,事情就出了问题。我使用 AVAudioPlayer 播放我的背景音乐。当调用 applicationWillResignActive 时,在显示暂停屏幕的同一操作中,音乐被告知暂停。但是当您通过多任务返回应用程序时,暂停屏幕仍会正常显示,但音乐也仍在播放。我在很多地方尝试过停止音乐,但它拒绝停止。即使切换视图后,音乐仍然播放。它完全没有反应。

这非常令人沮丧。请帮忙!

【问题讨论】:

【参考方案1】:

我今天花了几个小时来解决完全相同的问题。 我终于有一个解决方法。 #stop 方法释放硬件,但不会忘记当前播放位置。 因此,您可以再次调用#play 并根据需要继续播放。

我之前的代码是:

[player pause];
...
if ([player isPaused])  [player play]; 

这当然没用,正如您所经历的那样,在应用回到前台后,播放愉快地恢复了。

现在我有这样的东西:

self.playbackSuspended = YES;
[player stop];
...
if (self.playbackSuspended)  [player play]; 

一个 hack,但它有效。唯一的缺点是隐式调用#prepareToPlay 以重新获得播放硬件、重新缓冲等的所有权,因此播放可能会有延迟 - 到目前为止我还没有注意到。

另请注意,根据您的实施,在上述 hack 之后处理中断(例如电话呼叫)可能会中断。电话中断行为正常,因此通过像上面这样的黑客攻击,任何共享代码都可能处于中断处理的混乱状态。

【讨论】:

以上是关于多任务处理后 AVAudioPlayer 继续播放的主要内容,如果未能解决你的问题,请参考以下文章

在后台播放一个 AVAudioPlayer 实例

多视图应用程序中的 AVAudioPlayer 问题

iOS - AVAudioPlayer 在后台不会继续播放下一首歌曲

AVPlayer 暂停后无法继续播放

多线程处理任务后,继续主线程任务

AVAudioPlayer 失去“播放”状态