如何在用户关闭 AVPlayer 时获取视频播放时间
How To Get Time of Video Playback When User Closes AVPlayer
在应用程序中,用户应该观看设置视频。如果他们没有看完并点击 'close' 按钮,我想知道他们停在哪里,这样我就可以在他们再次开始观看时从那个地方开始播放视频。
我想知道他们停止观看的时间是什么时候,这样我就可以将该号码保存到服务器以备后用,使用以下代码:
player.seek(to: CMTimeMakeWithSeconds(637, 1))
我尝试了以下方法:
func showUnplayedVideo() {
// 1. check to see if user has already watched the app overview video
ref.child("videos")
.child("appOverview")
.child("watched")
.observeSingleEvent(of: .value) { (snapshot) in
let watched = snapshot.value as? Bool ?? false
if !watched {
// 2. show setup video popup on first load
guard let videoURL = URL(string: VideoURL.appOverview.rawValue) else { print("url error"); return }
let player = AVPlayer(url: videoURL)
self.playerVC.player = player
// 3. dismiss the player once the video is over and update Firebase
NotificationCenter.default.addObserver(self,
selector: #selector(self.playerDidFinishPlaying),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: self.playerVC.player?.currentItem)
NotificationCenter.default.addObserver(self,
selector: #selector(self.playerWasStoppedPrematurely),
name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime,
object: self.playerVC.player?.currentItem)
self.present(self.playerVC, animated: true) {
self.playerVC.player?.play()
}
}
}
}
@objc func playerWasStoppedPrematurely(note: NSNotification) {
self.playerVC.dismiss(animated: true)
print(playerVC.player?.currentTime())
}
第一个通知 'AVPlayerItemDidPlayToEndTime' 效果很好(对于一直观看视频的用户),但我的另一个通知 'AVPlayerItemFailedToPayToEndTime' 不起作用(对于中途停止的用户)视频)。
如果我的用户没有观看整个视频,我如何获得他们的停止点?
编辑 #1
这是播放视频时的画面:
您正在从视图控制器中呈现 playerVC。当 playerVC 关闭时,您的视图控制器中的 viewDidAppear()
将被调用。这是放时间校验码的选择。
原答案
您已经在使用 player.currentTime()
。为什么不也把它放在关闭按钮处理程序中?像这样
let current = Double(CMTimeGetSeconds(avPlayer.currentTime()))
在应用程序中,用户应该观看设置视频。如果他们没有看完并点击 'close' 按钮,我想知道他们停在哪里,这样我就可以在他们再次开始观看时从那个地方开始播放视频。
我想知道他们停止观看的时间是什么时候,这样我就可以将该号码保存到服务器以备后用,使用以下代码:
player.seek(to: CMTimeMakeWithSeconds(637, 1))
我尝试了以下方法:
func showUnplayedVideo() {
// 1. check to see if user has already watched the app overview video
ref.child("videos")
.child("appOverview")
.child("watched")
.observeSingleEvent(of: .value) { (snapshot) in
let watched = snapshot.value as? Bool ?? false
if !watched {
// 2. show setup video popup on first load
guard let videoURL = URL(string: VideoURL.appOverview.rawValue) else { print("url error"); return }
let player = AVPlayer(url: videoURL)
self.playerVC.player = player
// 3. dismiss the player once the video is over and update Firebase
NotificationCenter.default.addObserver(self,
selector: #selector(self.playerDidFinishPlaying),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: self.playerVC.player?.currentItem)
NotificationCenter.default.addObserver(self,
selector: #selector(self.playerWasStoppedPrematurely),
name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime,
object: self.playerVC.player?.currentItem)
self.present(self.playerVC, animated: true) {
self.playerVC.player?.play()
}
}
}
}
@objc func playerWasStoppedPrematurely(note: NSNotification) {
self.playerVC.dismiss(animated: true)
print(playerVC.player?.currentTime())
}
第一个通知 'AVPlayerItemDidPlayToEndTime' 效果很好(对于一直观看视频的用户),但我的另一个通知 'AVPlayerItemFailedToPayToEndTime' 不起作用(对于中途停止的用户)视频)。
如果我的用户没有观看整个视频,我如何获得他们的停止点?
编辑 #1
这是播放视频时的画面:
您正在从视图控制器中呈现 playerVC。当 playerVC 关闭时,您的视图控制器中的 viewDidAppear()
将被调用。这是放时间校验码的选择。
原答案
您已经在使用 player.currentTime()
。为什么不也把它放在关闭按钮处理程序中?像这样
let current = Double(CMTimeGetSeconds(avPlayer.currentTime()))