私は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することによって、持続時間が適切に返されます。
解決策を質問の一部としてではなく、回答として提供してください。あなたは48時間以内にあなた自身の答えを受け入れることさえできます。 – matt
しかし、単にpayerItemが準備ができているということは、その期間があることを意味するものではありません。あなたはdurationプロパティでKVOをしたいかもしれません。 – mahboudz