here과 같은 제안과 마찬가지로 player.status에서 KVO를 사용하여 구현했습니다.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를 AND AVPlayerItem 모두 상태 속성이 내 관심을왔다. AVPlayerItem.status 속성을 KVO로 처리하면 AVPlayer.status와 반대되는 효과가 나타나기 때문에 기간이 올바르게 반환됩니다.
문제의 일부가 아닌 해결책으로 솔루션을 제공하십시오. 48 시간 내에 직접 답변을 수락 할 수도 있습니다. – matt
그러나 payerItem이 준비 되었기 때문에 기간이 있음을 의미하지는 않습니다. duration 속성에서 KVO를 원할 수 있습니다. – mahboudz