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