2016-02-16 3 views
3

Я пытаюсь создать видеоплеер с AVPlayer.Videos загрузить с youtube. Я хочу, когда текущее время видео изменится, мой uiSlider и моя метка времени могут обновиться. Я использую метод «observValueForKeyPath», чтобы получить статус «loadedTimeRanges» из позиции игрока. Вот мой код:Swift watchvalueforkeypath + loadedTimeRanges только называется ограниченным временем

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     print("keyPath: \(keyPath)") 
     let playerItem:AVPlayerItem = object as! AVPlayerItem 
     if keyPath == "status" { 
      if playerItem.status == AVPlayerItemStatus.ReadyToPlay{ 
       print("AVPlayerItemStatusReadyToPlay") 
      } else if playerItem.status == AVPlayerItemStatus.Failed { 
       print("AVPlayerItemStatusFailed") 
      } 
     } else if keyPath == "loadedTimeRanges" { 
      let currentTime = playerItem.currentTime().seconds 
      let totalDuration = playerItem.duration.seconds 
      print("value: \(Float(currentTime/totalDuration))") 
      self.monitoringPlayback(player.currentItem!) 
      self.slider.setValue(Float(currentTime/totalDuration), animated: false) 
     } 
    } 

    func monitoringPlayback(playerItem:AVPlayerItem) { 
     let currentSecond:Double = playerItem.currentTime().seconds 
     self.updateVideoSlider(currentSecond) 
     let timeString = self.updateTime(playerItem.duration.seconds - currentSecond) 
     print("time string: \(timeString)") 
     self.lblTime.text = timeString 
    } 

Однако метод «observeValueForKeyPath» вызывался только 20-22 раз каждый раз. Пожалуйста, проверьте скриншот журнала: https://gyazo.com/5ca57ba532689d83aea855ae41387f53 Это первый раз, когда я использую этот метод, поэтому, возможно, я не понял, как он работает. Если кто-нибудь знает это, пожалуйста, скажите мне, почему. Спасибо, что прочитал мой вопрос.

+0

Если вы хотите знать, ток время воспроизведения, почему вы не используете метод 'currentTime' на' AVPlayer'? , Прямо сейчас вы наблюдаете диапазоны времени, которые были загружены для элемента. Когда вы закончите куски для загрузки, вы перестанете получать уведомление. –

+0

Но как я могу узнать о событии изменения времени? – Ashley

+0

Из документов 'Это свойство не является ключевым значением наблюдаемого; используйте addPeriodicTimeObserverForInterval: queue: usingBlock: или addBoundaryTimeObserverForTimes: queue: usingBlock: вместо. ' –

ответ

-1

его, легко

вар rightCurrentTimer: UILabel = {

let lbl = UILabel() 
    lbl.text = "00:00" 
    lbl.textColor = .white 
    lbl.translatesAutoresizingMaskIntoConstraints = false 
    lbl.font = UIFont.systemFont(ofSize: 11) 
    return lbl 

}() 

let leftWhatTimePlayed:UILabel = { 

    let lbl = UILabel() 
    lbl.translatesAutoresizingMaskIntoConstraints = false 
    lbl.textColor = .white 
    lbl.text = "00:00" 
    lbl.font = UIFont.systemFont(ofSize: 11) 
    return lbl 

}() 

Пусть интервал = CMTime (значение: 1, временные рамки: 1)

player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (timeProgress) in 

     let secondsPlay = CMTimeGetSeconds(timeProgress) 
     let secondString = String(format:"%02d" , Int(secondsPlay) % 60) 
     let minutesString = String(format:"%02d", Int(secondsPlay)/60) 

     self.leftWhatTimePlayed.text = "\(minutesString):\(secondString)" 

     if let duration = self.player?.currentItem?.duration { 

      let totalSecond = CMTimeGetSeconds(duration) 

      let whatSecondIsPlay = totalSecond - secondsPlay 

      let secondsIsPlay = String(format:"%02d" , Int(whatSecondIsPlay) % 60) 
      let minutesIsPlay = String(format: "%02d", Int(whatSecondIsPlay)/60) 

      self.rightCurrentTimer.text = "\(minutesIsPlay):\(secondsIsPlay)" 
      self.videoLengthTimeSlider.value = Float(secondsPlay/totalSecond) 

     } 


    }) 

 Смежные вопросы

  • Нет связанных вопросов^_^