AVPlayerItemDidPlayToEndTimeNotification 未触发

Posted

技术标签:

【中文标题】AVPlayerItemDidPlayToEndTimeNotification 未触发【英文标题】:AVPlayerItemDidPlayToEndTimeNotification not firing 【发布时间】:2015-11-23 12:31:04 【问题描述】:

我正在使用 AVPlayer 从 url 播放视频。 AVPlayerItemDidPlayToEndTimeNotification 未触发。我已经设置了断点来检查。下面是我的代码 sn-p:-

    @IBAction func playButtonClicked(sender: UIButton) 
    let url:NSURL = NSURL(string: self.currentSelectedContent.link)!
    moviePlayer = AVPlayer(URL: url)
    playerViewController = AVPlayerViewController()
    playerViewController.player = moviePlayer

    self.presentViewController(playerViewController, animated: true) 
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "moviePlayBackFinished", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.moviePlayer)
        self.playerViewController.player?.play()
    



func moviePlayBackFinished() 
    self.playerViewController.dismissViewControllerAnimated(true, completion: nil)

【问题讨论】:

【参考方案1】:

根据文档,观察到的对象必须是 AVPlayerItem 实例,而不是 AVPlayer 本身。尝试将self.moviePlayer 更改为self.moviePlayer.currentItem

【讨论】:

终于找到正确答案了,这个好难找!非常感谢!【参考方案2】:

AVPlayer 的 actionAtItemEnd 属性是 KVO 兼容的:

moviePlayer.addObserver(self, forKeyPath: "actionAtItemEnd", options: [], context: nil)


override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) 
    if keyPath == "actionAtItemEnd"
        // 
        print("FINISH")
    

https://developer.apple.com/documentation/avfoundation/avplayer/1387376-actionatitemend

https://developer.apple.com/documentation/avfoundation/avplayeractionatitemend

【讨论】:

【参考方案3】:

这对我有用:

NotificationCenter.default.addObserver(self, 
selector:#selector(didEndPlayback), 
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object:nil)

【讨论】:

什么是NativeVideoPlayer 抱歉,这是我用于我的一个项目的代码。编辑了我的答案。您必须编写任何要在触发通知时调用的选择器。请注意,对象nil 在这里,因为这样它将为每个项目触发。如果您只需要单个项目,当然可以在此处指定单个播放器项目。 在我的情况下它不起作用。我只是想播放该项目一次,但它是无限循环播放的 didEndPlayback 选择器中的代码看起来有些问题。您可以分享代码以获得更多帮助。 就我而言,有多个播放器,每个播放器播放一个文件。我不明白为什么会这样。但就我而言,我用我自己的替换了现有的播放器处理程序实现。这些实现之间的主要区别 - 我没有明确使用AVPlayerItem - 播放器直接用文件名初始化。

以上是关于AVPlayerItemDidPlayToEndTimeNotification 未触发的主要内容,如果未能解决你的问题,请参考以下文章