AVPlayerItem.duration возвращается как NaN даже после player.status == .readyToPlay

У меня есть реализация, использующая KVO для player.status, очень похожая на задокументированное предложение здесь.

Вот соответствующие биты:

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 свойства AVPlayerItem.status, а не AVPlayer.status, как я сделал, продолжительность будет возвращена правильно.


person Sam L.    schedule 13.04.2017    source источник
comment
Предоставьте свое решение как ответ, а не как часть вопроса. Вы даже можете принять свой собственный ответ через 48 часов.   -  person matt    schedule 14.04.2017
comment
Однако то, что payerItem готов, не означает, что продолжительность готова. Вы можете захотеть сделать KVO для свойства duration.   -  person mahboudz    schedule 19.12.2017


Ответы (1)


Итак, до него дошло, что и AVPlayer, и AVPlayerItem имеют статусные свойства. Путем KVO свойства AVPlayerItem.status, а не AVPlayer.status, как я сделал, продолжительность будет возвращена правильно.

person Jonny    schedule 02.10.2017
comment
Веселая :-). Однако то, что payerItem готов, не означает, что продолжительность готова. - person mahboudz; 19.12.2017