之后,AVPlayerItem.duration仍然以NaN的形式返回。我有一个在player.status上使用KVO的实现,非常类似于记录为here的建议。即使在player.status == .readyToPlay
这里的相关位:
var player: AVPlayer?
var url = URL(string: "some video url")!
override func viewDidLoad() {
super.viewDidLoad()
initializeVideoPlayer()
}
func initializeVideoPlayer() {
let playerItem = AVPlayerItem(url: url)
self.player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.layer.bounds
videoView.layer.addSublayer(playerLayer)
player?.addObserver(self, forKeyPath: "status", options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "status" {
if player?.status == .readyToPlay {
print(player?.currentItem?.duration)
print(CMTimeGetSeconds((player?.currentItem?.duration)!))
// let videoLength = CMTimeGetSeconds((player?.currentItem?.duration)!)
// videoProgressSlider.maximumValue = Float(videoLength)
}
}
}
尽管状态,什么是返回仍然是NaN。
解决方案:
所以它引起我注意这两个AVPlayer和AVPlayerItem有状态的属性。通过KVO'ing AVPlayerItem.status属性而不是AVPlayer.status像我这样做,持续时间将被正确返回。
提供您的解决方案作为答案,而不是问题的一部分。你甚至可以在48小时内接受你自己的答案。 – matt
但是,仅仅因为payerItem已准备好并不意味着持续时间是。您可能想要在持续时间属性上执行KVO。 – mahboudz