AVAudioPlayer失去“播放”状态

时间:2012-08-10 02:20:15

标签: ios avaudioplayer

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

音频被设置为plist& amp;中的背景模式。这是在发布时运行的:

[[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 个答案:

答案 0 :(得分:4)

Bug的描述

如果您正在播放 AVAudioPlayer,那么您创建 AVPlayer,播放图标将消失。显然AVPlayer优先于AVPlayer。因为它还没有播放,播放图标会从状态栏中消失。

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

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

    首先,如果您不必使用AVAudioPlayer,则不要。我使用它是因为我需要播放远程MP3而不先下载它。我曾经使用过这个AudioStreamer类但放弃了,因为它会在流与其他一些我无法解决的错误断开连接时弹出警报。

    因此,如果你坚持使用AVPlayer,只有一种方法可以将你的setCurrentTime重新连接到播放状态。 如果您在AVAudioPlayer上致电AVPlayer,那么它会神奇地将自己重新关联为该应用的当前播放器。因此,您需要在初始化AVAudioPlayer之后以及在setCurrentTime上恢复播放时随时拨打电话。

    我决定将AVAudioPlayer子类化,以便我可以在全局列表中注册它(当它被初始化时)并在解除分配时取消注册它。我也覆盖了play方法,这样任何恢复播放的调用也会调用setCurrentTime。然后我将AVPlayer子类化,以便任何时候初始化,所有活动的AVAudioPlayers都会调用setCurrentTime。最后一件事 - 你需要在短暂的,可能是1秒的延迟后拨打{{1}},否则它将无效。

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