Ios 要从avplayer获取视频当前播放时间和视频总时间吗

Ios 要从avplayer获取视频当前播放时间和视频总时间吗,ios,swift,uitableview,avplayer,Ios,Swift,Uitableview,Avplayer,我正在我的应用程序中使用AVPlayer播放视频,我现在完全成功地播放了视频,我希望视频总时间和当前连续播放时间,因此我尝试了一些方法让我向您展示 我尝试过使用NotificationCenter,但是每次我都会得到0.0,过了一段时间我会崩溃,让我给你看看我的代码 这是我的视频播放代码 func videoPlay(){ player = AVPlayer(url: videoURL!) let playerController = AVPlayerViewC

我正在我的应用程序中使用
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)
    }
 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)
           }
 }
但我仍然没有得到目前的比赛时间,我得到崩溃,并给出以下错误

错误


线程8:EXC\u BAD\u访问(code=1,address=0xfffffff7ac4eef)
尝试下面的代码,您将获得播放项目的总持续时间。您需要等待玩家准备好玩您的物品,为此您需要添加观察员

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

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

@objc func gettime(_ notification: Notification){
        let currentTime = Float(player.currentTime().value)
        print(currentTime)
    }
 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)
           }
 }

希望这能帮助别人快乐编码

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


我复制粘贴了你的确切代码,效果很好。你能提供你试图播放的流的URL吗?@SeanIngeAsbjørnsen是的,确定这是我的URL
https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
我的代码仍然给我错误,请您提供您的vieoURLIt在该URL中也可以正常工作。这是我的完整代码供参考:我得到了这个错误
条件绑定的初始值设定项必须具有可选类型,不是“CMTime”
请检查我是否编辑了您的答案,我在哪一行收到错误感谢我的完整帮助,但现在我想在tableview上显示时间如何在tableview上显示请帮助mevar currentTimeLabel:UILabel{let label=UILabel()//使用视频标签中的正确位置。frame=CGRect(x:10,y:100,宽:20,高:20)label.translatesAutoResizezingMASKINTOCONSTRAINTS=false return label}playerController.view.addsubview(currentTimeLabel)//顺便说一句:最好使用容器并将播放机作为子视图添加到该容器中,而不是playerController.Views,但如果我想在您的
CellForRowatineXpath func
中将此秒和分钟显示到tableview单元格中,该怎么办?将数据发送到标签例如:`currentTimeLabel.text=SecondStrings,但如果您有模型,您应该创建在cell类中创建一个变量并向该变量发送数据