2017-04-13 58 views
0

之後,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像我這樣做,持續時間將被正確返回。

+0

提供您的解決方案作爲答案,而不是問題的一部分。你甚至可以在48小時內接受你自己的答案。 – matt

+0

但是,僅僅因爲payerItem已準備好並不意味着持續時間是。您可能想要在持續時間屬性上執行KVO。 – mahboudz

回答

1

因此,他注意到AVPlayerAVPlayerItem都有狀態屬性。通過KVO'ing AVPlayerItem.status屬性而不是AVPlayer.status像我這樣做,持續時間將被正確返回。

+0

滑稽:-)。但是,僅僅因爲payerItem已準備就緒並不意味着持續時間是。 – mahboudz