AVPlayer 不在后台切换 AVPlayerItems
AVPlayer not switching AVPlayerItems in background
我正在尝试为 SoundCloud 制作一个自定义播放器,因为在 Swift-iOS(前进和后退)功能中没有对完整播放器的本地支持;然后我决定使用 AVPlayer 而不是 AVQueuePlayer。
我有一个曲目 class,其中包含关于我的曲目(Url)的相关信息。一个 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 永远不会被触发时,除非我将应用程序带到前台。
我在下面使用了SO上提供的信息post
我正在尝试为 SoundCloud 制作一个自定义播放器,因为在 Swift-iOS(前进和后退)功能中没有对完整播放器的本地支持;然后我决定使用 AVPlayer 而不是 AVQueuePlayer。
我有一个曲目 class,其中包含关于我的曲目(Url)的相关信息。一个 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 永远不会被触发时,除非我将应用程序带到前台。
我在下面使用了SO上提供的信息post