问题描述
尝试像这样用 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