AVAudioPlayer 失去“播放”状态

Posted

技术标签:

【中文标题】AVAudioPlayer 失去“播放”状态【英文标题】:AVAudioPlayer Loses "Playing" Status 【发布时间】:2012-08-10 02:20:14 【问题描述】:

我有一个需要在后台继续播放的 AVAudioPlayer。

音频在 plist 中设置为后台模式,并且在启动时运行:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[[RootController shared].view becomeFirstResponder];

AVAudiosession* session = [AVAudioSession sharedInstance];
[session setDelegate: self];
[session setActive:YES error:nil];
[session setCategory: AVAudioSessionCategoryPlayback error:nil];

- (BOOL)canBecomeFirstResponder  return YES; 

问题

AVAudioPlayer 有时会进入这种奇怪的状态:

正在播放,但状态栏中的播放图标消失了 如果我暂停然后播放,图标可能会显示一秒钟,然后消失 这是踢球者 - 如果我在播放时拨打setCurrentTime,播放图标会显示并停留

我已经为此投入了大约 20 个小时,并且希望有任何想法。

【问题讨论】:

【参考方案1】:

错误描述

如果您正在播放 AVAudioPlayer,然后创建 AVPlayer,播放图标将消失。显然AVPlayer 立即优先 & 因为它还没有播放,所以播放图标从状态栏中消失。

这会导致一些严重的问题:

    如果应用在后台,iOS 将在 5 秒内关闭您的 AVAudioPlayer(因为它没有意识到您正在播放音频) 即使正在播放音频,iOS 遥控器也会显示播放按钮 播放图标未显示在状态栏中

解决方法

首先,如果您不必使用AVPlayer,请不要使用。我使用它是因为我需要在不先下载的情况下播放远程 MP3。我曾经使用过这个AudioStreamer 类,但后来放弃了,因为当流断开连接时它会弹出一个警报以及一些我无法修复的其他错误。

因此,如果您无法使用 AVPlayer,则只有一种方法可以将播放状态与您的 AVAudioPlayer 重新连接。 如果您在AVAudioPlayer 上调用setCurrentTime,它会神奇地重新关联为应用程序的当前播放器。因此,您需要在任何 AVPlayer 初始化后以及任何时候在 AVAudioPlayer 上恢复播放时调用它。

我决定继承 AVAudioPlayer,这样我就可以在全局列表中注册它(当它被初始化时)并在它被释放时取消注册它。我还覆盖了播放方法,以便任何恢复播放的调用也将调用 setCurrentTime。然后我将 AVPlayer 子类化,以便在任何时候初始化一个,所有活动的 AVAudioPlayers 都会对自己调用 setCurrentTime。最后一件事 - 您必须在短暂的(可能是 1 秒)延迟后致电 setCurrentTime,否则它将不起作用。

不开玩笑,这是近 40 小时故障排除的结果。

【讨论】:

以上是关于AVAudioPlayer 失去“播放”状态的主要内容,如果未能解决你的问题,请参考以下文章

触发 AVAudioPlayer 以停止所有声音并播放选定的声音,除非单击播放(选定)按钮

Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件

即使 iPhone 处于静音状态,AVAudioPlayer 仍在播放环境声音

iOS:将 AVAudioPlayer 的实例从一个变量移动到另一个变量

Swift - AVAudioPlayer,声音播放不正确

AVAudioPlayer 中断后从相同状态恢复音频剪辑