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类中创建一个变量并向该变量发送数据