用户关闭 AVPlayer 时如何获取视频播放时间

Posted

技术标签:

【中文标题】用户关闭 AVPlayer 时如何获取视频播放时间【英文标题】:How To Get Time of Video Playback When User Closes AVPlayer 【发布时间】:2018-08-08 05:08:20 【问题描述】:

在应用程序中,用户应该观看设置视频。如果他们没有看完并点击“关闭”按钮,我想知道他们在哪里停下来,这样我就可以在他们再次开始观看时让视频从那个位置开始。

我想知道他们停止观看的时间是什么时候,所以我可以使用以下代码将该号码保存到服务器以供以后使用:

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

这是播放视频时屏幕的样子:

【问题讨论】:

【参考方案1】:

您正在从视图控制器呈现 playerVC。当 playerVC 关闭时,您的视图控制器中的 viewDidAppear() 将被调用。这是一个放置时间检查代码的选择。

原答案

您已经在使用player.currentTime()。为什么不把它放在关闭按钮处理程序中呢?像这样的

let current = Double(CMTimeGetSeconds(avPlayer.currentTime()))

【讨论】:

很好的建议。只有一个问题:“关闭按钮处理程序”在哪里?我如何访问它?我应该用“关闭按钮处理程序”替换我的第二个通知吗?假装我是一个完全的菜鸟,不知道我在做什么:-) 示例代码非常有用。 @PhontaineJudd 你提到了“用户点击‘关闭’按钮”。你如何处理关闭按钮事件?您使用的是 IBAction 还是倒带 segue? AVKit 自动在屏幕顶部创建“x”,在底部创建播放按钮和时间滑块。我不知道如何访问这些属性。 我添加了一张图片来帮助澄清。 @PhontaineJudd 我编辑了我的答案,看看是否有帮助

以上是关于用户关闭 AVPlayer 时如何获取视频播放时间的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer - 如何以编程方式打开/关闭来自 HTTP Live Streaming 视频的 CC?

如何在 wkwebview 视频中禁用自动启动 AVPlayer

想要在 AVPlayer 中播放视频时逐帧提取视频中的所有图像

使用swift 3点击单元格时如何在Avplayer中播放来自url的视频

如何在 Swift3 iOS 中以特定时间在 AVPlayer 中播放视频

向上滑动(将应用程序置于后台)并且视频在自定义 AVPLayer 中播放时如何停止画中画?