代码之家  ›  专栏  ›  技术社区  ›  user6083088

AVPlayer未在后台切换AVPlayerItems

  •  1
  • user6083088  · 技术社区  · 9 年前

    我正在尝试为SoundCloud制作一个自定义播放器,因为Swift iOS(向前和向后)功能中没有对成熟播放器的本地支持;然后我决定使用AVPlayer而不是AVQueuePlayer。

    我有一个Tracks类,它保存了关于我的曲目(Url)的相关信息。具有队列相关信息的轨迹队列-多个轨迹&如果我可以通过检查轨迹数组的数组索引来正向或反向逻辑。

    我还启用了应用程序设置中的背景模式,并添加了以下代码,正如许多人在我的ViewController的viewDidLoad()中启动应用程序时建议的那样

    UIApplication.shared.beginReceivingRemoteControlEvents()
    

    我所做的就是从AVPlayer中删除观察者并启动一个新的观察者,然后在收到通知后用新的AVPlayerItem替换当前项。名称AVPlayerItemDidPlayToEndTime通知。

    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永远不会被触发时,除非我把应用程序带到前台。

    1 回复  |  直到 9 年前
        1
  •  1
  •   user6083088    9 年前

    我在下面的帖子中使用了SO提供的信息

    1. AVPlayer Not Loading Media In Background
    推荐文章