繁体   English   中英

AVAudioPlayer丢失“正在播放”状态

[英]AVAudioPlayer Loses “Playing” Status

我有一个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个小时,并且喜欢任何想法。

错误说明

如果您正在播放 AVAudioPlayer创建一个AVPlayer ,播放图标将消失。 显然, AVPlayer立即优先,因为它尚未播放,但播放图标从状态栏中消失了。

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

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

解决方法

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM