【问题标题】:want to fetch video current playing time and total time of video from avplayer想要从 avplayer 获取视频当前播放时间和视频总时间
【发布时间】:2019-09-27 02:07:44
【问题描述】:

我正在实现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)

【问题讨论】:

  • 我复制粘贴了您的确切代码,它工作正常。您能否提供您尝试播放的流的 URL?
  • @SeanIngeAsbjørnsen 是的,这是我的网址https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
  • 我的代码仍然给我错误,请您提供 vieoURL
  • 它也适用于该 URL。这是我的完整代码供参考:pastebin.com/Phz9aG35

标签: ios swift uitableview avplayer


【解决方案1】:

尝试以下代码,您将获得播放项目的总时长。你需要等待玩家准备好播放你的物品,为此你需要添加观察者

在你的 viewDidLoad 方法中添加以下代码。

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

一旦您的播放器准备好播放项目(视频),调用的 observeValue(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 {}
    }
}

【讨论】:

  • 我收到此错误Initializer for conditional binding must have Optional type, not 'CMTime'
  • 请检查我是否已编辑您的答案,在哪一行出现错误
【解决方案2】:

我用addPeriodicTimeObserver Observer 解决了我的问题,如下所示:

 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)
           }
 }

【讨论】:

    【解决方案3】:

    在您的视图中定义标签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)"
    
    

    【讨论】:

    • 感谢这个帮助我,但现在我想在 tableview 上显示那个时间我如何在 table view 上显示请帮助我
    • var currentTimeLabel: UILabel { let label = UILabel() //使用视频中的正确位置 label.frame = CGRect(x: 10, y: 100, width: 20, height: 20) label.translatesAutoresizingMaskIntoConstraints = false return label } playerController.view.addsubview(currentTimeLabel) //顺便说一句:最好使用容器并将播放器作为子视图添加到该容器而不是 playerController.view
    • 但是如果我想在表格视图单元格中显示这一秒和一分钟怎么办
    • 在您的cellForRowAtIndexPath func 中将数据发送到您的标签,例如:`currentTimeLabel.text = secondString
    • 但是如果你有模型,你应该在你的单元类中创建一个变量并将数据发送到那个变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多