Swift,如何在 AVPlayer 上播放视频期间获得事件点击完成按钮?

Posted

技术标签:

【中文标题】Swift,如何在 AVPlayer 上播放视频期间获得事件点击完成按钮?【英文标题】:Swift, how to get event click done button during play the video on AVPlayer? 【发布时间】:2016-11-22 09:14:38 【问题描述】:

我有一个 TableViewController,我通过点击单元格内的按钮在该表格上播放视频,以便由 AVPlayer 通过代码播放

@IBAction func btnFullScreen(sender: AnyObject)     
    let playController = AVPlayerViewController()
    self.presentViewController(playController, animated: true, completion: nil)
    playController.player?.play()

所以,它将全屏播放视频,并且左上角的完成按钮也存在。我想得到事件完成按钮,点击完成按钮后,它会得到玩家的当前时间做更多的事情。 但是如何让事件点击完成按钮?

【问题讨论】:

【参考方案1】:

目前,您无法拦截 AVPlayerController 的 Done 按钮,为此提交了一个错误报告,radar: 27047358

您只能为AVPlayerItemDidPlayToEndTimeNotification 添加一个观察者,该观察者将在您的项目播放完毕时触发。

也根据文档:

不要继承 AVPlayerViewController。覆盖这个类的 方法不受支持并导致未定义的行为。

参考 - here

【讨论】:

感谢您的回答,您可以更新为您的答案的代码吗?因为我尝试使用 PlayerItemDIdReachEnd,但是 swift 2.2 上没有选项或名称 对不起,你可以试试 AVPlayerItemDidPlayToEndTimeNotification 此选项无法控制何时点击完成按钮。它只是控制视频何时播放完整的视频长度。 :( 这就是我在回答中告诉你的:) @AhmadF 可以通过覆盖 AVPlayerController 的类方法来实现,这不是推荐的方式,文档中也提到了。【参考方案2】:

我正在使用这个技巧,它适用于我的场景,但它可能会给你一个线索:

第一步:

在你想从那里展示你的视图控制器的视图控制器上添加观察者,以便在其帧发生变化时得到通知:

 self.playerViewController.addObserver(self, forKeyPath: #keyPath(MyViewController.view.frame), options: .new, context: nil)
 NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying),
                                               name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.playerViewController.player!.currentItem)

第二步:

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
    if (keyPath ==  #keyPath(MyViewController.view.frame))

        if playerViewController.player?.rate == 0
            doneClicked()
        
    

第三步:

    func doneClicked()

    self.playerViewController.player!.pause()
    self.playerViewController.player!.rate =  0.0
    self.playerViewController.player = nil
    self.playerViewController.removeObserver(self, forKeyPath: #keyPath(HomeTabViewController.view.frame))
    NotificationCenter.default.removeObserver(self)
    self.playerViewController.dismiss(animated: false, completion: nil)

【讨论】:

以上是关于Swift,如何在 AVPlayer 上播放视频期间获得事件点击完成按钮?的主要内容,如果未能解决你的问题,请参考以下文章

在 IOS 9 上使用 AVPlayer 和 Swift 反向播放视频

Swift 应用程序上的 AVPlayer 显示黑屏,但在播放视频时播放音频

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

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

使用 AVPlayer 播放的视频在 swift3 中从其容器视图中消失

当您离开视图时如何在 Swift 中停用 AVPlayer