How to detect when AVPlayer video ends playing? How to detect when AVPlayer video ends playing? ios ios

How to detect when AVPlayer video ends playing?


To get the AVPlayerItemDidPlayToEndTimeNotification your object needs to be an AVPlayerItem.

To do so, just use the .currentItem property on your AVPlayer

Now you will get a notification once the video ends!

See my example:

let videoPlayer = AVPlayer(URL: url)       NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:",        name: AVPlayerItemDidPlayToEndTimeNotification, object: videoPlayer.currentItem)func playerDidFinishPlaying(note: NSNotification) {    print("Video Finished")}

Swift 3

let videoPlayer = AVPlayer(URL: url)       NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")),        name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: videoPlayer.currentItem)func playerDidFinishPlaying(note: NSNotification) {    print("Video Finished")}

Don't forget to remove the Observer in your deinit

Swift 4, 5

NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil)


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")    }


Swift 4.2 Version:

var player: AVPlayer!  //  //// Configure Playeroverride func viewDidAppear(_ animated: Bool) {    super.viewDidAppear(animated)    let filepath: String? = Bundle.main.path(forResource: "selectedFileName", ofType: "mp4")    if let filepath = filepath {        let fileURL = URL.init(fileURLWithPath: filepath)        player = AVPlayer(url: fileURL)        let playerLayer = AVPlayerLayer(player: player)        // Register for notification        NotificationCenter.default.addObserver(self,                                               selector: #selector(playerItemDidReachEnd),                                                         name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,                                                         object: nil) // Add observer        playerLayer.frame = self.view.bounds        self.view.layer.addSublayer(playerLayer)        player.play()    }}// Notification Handling@objc func playerItemDidReachEnd(notification: NSNotification) {    player.seek(to: CMTime.zero)    player.play()}// Remove Observerdeinit {    NotificationCenter.default.removeObserver(self)}