How to detect when AVPlayer video ends playing?

前端 未结 10 918
感动是毒
感动是毒 2020-11-28 07:48

I\'am using AVPlayer for playing local video file (mp4) in Swift. Does anyone know how to detect when video finish with playing? Thanks

相关标签:
10条回答
  • 2020-11-28 08:28

    Swift 3.0

    let videoPlayer = AVPlayer(URL: url)
    
    NotificationCenter.default.addObserver(self, selector:#selector(self.playerDidFinishPlaying(note:)),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
    
    @objc func playerDidFinishPlaying(note: NSNotification){
            print("Video Finished")
        }
    
    0 讨论(0)
  • 2020-11-28 08:35

    2019

    It's really this simple

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

    (It's fine for the object to be nil.)

    and then

    @objc func fileComplete() {
        print("IT'S DONE!")
    }
    
    0 讨论(0)
  • 2020-11-28 08:37

    I know there are a lot of accepted answers here...

    But, another route might be to add a boundary time observer to your AVPlayer. You would have to have the duration of the video, which you can get from your player.currentItem, and then add it as your desired time boundary.

    fileprivate var videoEndObserver: Any?
    
    func addVideoEndObserver() {
        guard let player = YOUR_VIDEO_PLAYER else { return }
    
        // This is just in case you are loading a video from a URL.
        guard let duration = player.currentItem?.duration, duration.value != 0 else {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: { [weak self] in
                self?.addVideoEndObserver()
            })
    
            return
        }
    
        let endTime = NSValue(time: duration - CMTimeMakeWithSeconds(0.1, duration.timescale))
        videoEndObserver = player.addBoundaryTimeObserver(forTimes: [endTime], queue: .main, using: {
            self.removeVideoEndObserver()
    
            // DO YOUR STUFF HERE...
        })
    }
    
    func removeVideoEndObserver() {
        guard let observer = videoEndObserver else { return }
    
        videoPlayer.player?.removeTimeObserver(observer)
        videoEndObserver = nil
    }
    
    0 讨论(0)
  • 2020-11-28 08:38

    For SWIFT 3.0

    Here 'fullUrl' is the URL of the video and make sure that there would be no space in the URL, You should replace 'Space' with '%20' so that URL will work file.

      let videoURL = NSURL(string: fullUrl)
      let player = AVPlayer(url: videoURL! as URL)
    
      playerViewController.delegate = self
      playerViewController.player = player
      self.present(playerViewController, animated: false) {
    
        self.playerViewController.player!.play()
    
        NotificationCenter.default.addObserver(self, selector: #selector(yourViewControllerName.playerDidFinishPlaying), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem)
      }
    

    Add this below given method in your view controller.

    func playerDidFinishPlaying(){    
    print("Video Finished playing in style")
    }
    
    0 讨论(0)
提交回复
热议问题