0

我有一个需要在后台继续的 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 个小时,并且会喜欢任何想法。

4

1 回答 1

4

错误描述

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

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

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

解决方法

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

因此,如果您被 AVPlayer 卡住,只有一种方法可以将播放状态与您的AVAudioPlayer. 如果你调用then setCurrentTimeAVAudioPlayer它会神奇地将自己重新关联为 app 的当前播放器。因此,您需要在 anyAVPlayer初始化后以及任何时候在AVAudioPlayer.

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

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

于 2012-08-10T19:44:54.160 回答