观察 AVplayer 何时准备好播放 - 迅速 - 以编程方式

问题描述

尝试像这样用 AVPlayer 播放视频:

if let video =  card.pageImageVideoController.controllers[0] as? VideoController{
    video.player.play()
}

我注意到视频无法播放。所以我更深入地检查,发现当我调用函数 .play() 时,AVPlayer 当前项是 nil。 我认为对此的解决方案应该是为玩家添加 KVO 观察器以查看项目何时准备好播放。我使用了这个堆栈溢出 question。 我把之前的代码修改成这样:

var playbackLikelyToKeepUpContext = 0

if let video = card.pageImageVideoController.controllers[0] as? VideoController{

    video.player.addobserver(self,forKeyPath: "currentItem.playbackLikelyToKeepUp",options: .new,context: &playbackLikelyToKeepUpContext)

}

override func observeValue(forKeyPath keyPath: String?,of object: Any?,change: [NSkeyvalueChangeKey : Any]?,context: UnsafeMutableRawPointer?) {
    guard let videoController = topCard!.pageImageVideoController.controllers[0] as? VideoController else { return }
    if context == &playbackLikelyToKeepUpContext {
        if videoController.player.currentItem!.isPlaybackLikelyToKeepUp {
            // loadingIndicatorView.stopAnimating() or something else
            print("ready")
        } else {
            // loadingIndicatorView.startAnimating() or something else
            print("not ready")
        }
    }
}

函数 observeValue 从未被调用。我不知道为什么。

解决方法

如果您的想法是检查项目是否准备好播放。然后最好将观察者置于状态。并检查观察者函数中的错误。如以下文档中所述: https://developer.apple.com/documentation/avfoundation/avplayeritem