2017-04-13 2 views
0

私はplayer.statusでKVOを使用して、hereと書かれているように実装しています。AVPlayerItem.durationは、player.status == .readyToPlayの後でもNaNとして返されます。

ここでは、関連するビットです:

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両方がステータス性質を持っていることを私の注意に来ています。私が行ったようにAVPlayer.statusとは対照的にAVPlayerItem.statusプロパティをKVOすることによって、持続時間が適切に返されます。

+0

解決策を質問の一部としてではなく、回答として提供してください。あなたは48時間以内にあなた自身の答えを受け入れることさえできます。 – matt

+0

しかし、単にpayerItemが準備ができているということは、その期間があることを意味するものではありません。あなたはdurationプロパティでKVOをしたいかもしれません。 – mahboudz

答えて

1

AVPlayerAVPlayerItemの両方にステータスプロパティがあることが注目されています。私が行ったようにAVPlayer.statusとは対照的にAVPlayerItem.statusプロパティをKVOすることによって、持続時間が適切に返されます。

+0

面白い:-)。しかし、単にpayerItemが準備が整っているということは、その継続時間が意味するものではありません。 – mahboudz

関連する問題