【问题标题】:AVPlayerItemDidPlayToEndTimeNotification not firingAVPlayerItemDidPlayToEndTimeNotification 未触发
【发布时间】: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)
}

【问题讨论】:

    标签: ios swift avplayer avplayerviewcontroller


    【解决方案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 - 播放器直接用文件名初始化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2020-11-26
      相关资源
      最近更新 更多