2017-04-13 4 views
0

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와 반대되는 효과가 나타나기 때문에 기간이 올바르게 반환됩니다.

+0

문제의 일부가 아닌 해결책으로 솔루션을 제공하십시오. 48 시간 내에 직접 답변을 수락 할 수도 있습니다. – matt

+0

그러나 payerItem이 준비 되었기 때문에 기간이 있음을 의미하지는 않습니다. duration 속성에서 KVO를 원할 수 있습니다. – mahboudz

답변

1

AVPlayerAVPlayerItem 모두 상태 속성을 갖게되었습니다. AVPlayerItem.status 속성을 KVO로 처리하면 AVPlayer.status와 반대되는 효과가 나타나기 때문에 기간이 올바르게 반환됩니다.

+0

웃기는 :-). 그러나 payerItem이 준비 되었기 때문에 기간이 있음을 의미하지는 않습니다. – mahboudz

관련 문제