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

时间:2020-12-30 14:28:27

标签: swift avfoundation avplayer avplayeritem

尝试像这样用 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 从未被调用。我不知道为什么。

1 个答案:

答案 0 :(得分:0)

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