【发布时间】:2017-08-30 18:31:24
【问题描述】:
我正在尝试为 SoundCloud 制作一个自定义播放器,因为 Swift-iOS(前进和后退)功能中没有对成熟播放器的原生支持;然后我决定使用 AVPlayer 而不是 AVQueuePlayer。
我有一个 Tracks 类,其中包含有关我的曲目(网址)的相关信息。一个 TracksQueue,其中包含有关队列的相关信息 - 多个轨道以及我是否可以通过检查轨道数组的数组索引来转发或反转逻辑。
我还在应用程序设置中启用了后台模式,并添加了以下代码,正如许多人建议的那样,当应用程序在我的 ViewController 的 viewDidLoad() 中启动时
UIApplication.shared.beginReceivingRemoteControlEvents()
一切都按预期工作,但唯一的问题是曲目会在背景中改变,但不会播放。
我所做的只是从 AVPlayer 中删除观察者并启动一个新的观察者,并根据 NSNotification.Name.AVPlayerItemDidPlayToEndTime 通知将当前项目替换为新的 AVPlayerItem。
fileprivate func restartCurrentTrack() {
if (player != nil) {
player?.removeObserver(self, forKeyPath: Keys.Status, context: &PGAudioPlayerManagetKVOContext)
}
if let _currentTrack = queue.currentTrack {
player = AVPlayer()
player.addObserver(self, forKeyPath: Keys.Status, options: NSKeyValueObservingOptions.new, context: &PGAudioPlayerManagetKVOContext)
if let _playerItem = _currentTrack.getPlayerItem() {
player?.replaceCurrentItem(with: _playerItem)
}
}
}
编辑 1:我找到了应用程序进入后台时没有播放的原因之一。我有 KVO,它通过检查播放器的状态来告诉我播放器何时准备好播放。只有当我收到相同的内容时,我才会开始
player.play()
但是当应用程序处于后台时,它不再收到此通知。有没有办法让我在应用程序处于后台时也能收到通知?
编辑 2:澄清一下,如果音乐从前台开始,应用程序会播放音乐。问题是在后台更改曲目是播放器就绪的 KVO 永远不会被触发,除非我将应用程序带到前台。
【问题讨论】:
-
我的应用确实在后台播放音乐,在更改曲目或启动另一个 AVPlayer 实例时出现问题是 KVO 不起作用
-
我收回了标志,但是,这是另一个重复:stackoverflow.com/questions/36348332/…,您是否尝试搜索已经存在的问题?也许你会发现一些你还没有尝试过的东西
-
@Sneak 是的,我看过这个和许多类似的帖子。但他们都没有提出理论以外的解决方案。到目前为止,它只是行不通。提议的解决方案只讨论推进到下一个项目,但我还需要反转,而 AVQueuePlayer 不支持。许多提议的 AVPlayer 但一旦应用程序进入后台并跟踪更改,所有提议的 SO 解决方案都会失败。
-
hmm .. 我自己无法尝试,但是设置时间太长,但是通过阅读我链接的类似帖子我 认为 , AVQueuePlayer 可能是解决方案.但是正如您所说,您需要 AVPlayer 功能,我不确定。 GL!
-
@Sneak 我让它在 SO 上使用几个线程来工作。我觉得很奇怪,Apple 没有像这样公开宣布。我想我们只需要拿出最好的来完成它。谢谢老哥!