хотите получить текущее время воспроизведения видео и общее время видео с avplayer - PullRequest
0 голосов
/ 09 мая 2019

Я использую AVPlayer для воспроизведения видео в моем приложении, и я полностью воспроизвел видео, теперь я хочу, чтобы общее время видео и текущее время воспроизведения непрерывно, поэтому для этого я попытался каким-то образом, позвольте мне показать вам

Я пытался использовать NotificationCenter, но для этого я получаю 0.0 каждый раз, и через некоторое время у меня происходит сбой, позвольте мне показать вам мой код

Вот мой код воспроизведения видео

 func videoPlay(){
        player = AVPlayer(url: videoURL!)
        let playerController = AVPlayerViewController()
        playerController.player = player
        self.addChild(playerController)
        self.view.addSubview(playerController.view)
        playerController.view.frame = CGRect(x: 0, y: 20, width: 375, height: 207)
        player.play()
        if player.rate != 0 && player.error == nil {
            print("video player is playing.................")
              NotificationCenter.default.addObserver(self,selector: #selector(gettime(_:)),name: nil,object: nil)
        } else {
            print("video player is NOT playing.")
        }
    }

и здесь я пытаюсь получить время из видео, как показано ниже

@objc func gettime(_ notification: Notification){
        let currentTime = Float(player.currentTime().value)
        print(currentTime)
    }

, но все еще не получаю текущее время воспроизведения, у меня происходит сбой и выдается ошибка ниже

Ошибка

Thread 8: EXC_BAD_ACCESS (code=1, address=0xfffffffff7ac4eef)

Ответы [ 3 ]

1 голос
/ 09 мая 2019

определите метку currentTimeLable на ваш взгляд и используйте этот код

 let interval = CMTime(value: 1, timescale: 2)
            player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (progressTime) in

                let seconds = CMTimeGetSeconds(progressTime)
                let secondString = String(format: "%02d", Int(seconds) % 60)
                let minutString = String(format: "%02d", Int(seconds) / 60)
                self.currentTimeLabel.text = "\(minutString):\(secondString)"

0 голосов
/ 09 мая 2019

Я решил свою проблему с addPeriodicTimeObserver Наблюдателем, как показано ниже

 self.player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1, preferredTimescale: 2), queue: DispatchQueue.main) {[weak self] (progressTime) in
          if let duration = self!.player.currentItem?.duration {
               let durationSeconds = CMTimeGetSeconds(duration)
               let seconds = CMTimeGetSeconds(progressTime)
               print(seconds)
           }
 }

Надеюсь, это поможет Someone Happy Coding !!

0 голосов
/ 09 мая 2019

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

В вашем viewDidLoad Метод добавьте следующий код.

player?.addObserver(self, forKeyPath: "status", options: [], context: nil)

Когда ваш проигрыватель будет готов воспроизвести элемент (видео), при вызове наблюдаемое значение (forKeyPath) вы получите общее время в методе getTotalTime () .

func getTotalTime() 
   if let seconds = player?.currentItem?.asset.duration {
      let totalTime = CMTimeGetSeconds(seconds)
      if let currentTime = player?.currentTime() {
             let time = CMTimeGetSeconds(currentTime)
      }
   }
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    if keyPath == "status" {
        if player?.status == AVPlayerStatus.readyToPlay {
          getTotalTime() 
        } else if player?.status == AVPlayerStatus.failed {}
    }
}
...