ios iphone swift avplayer

ios - ¿Cómo detectar cuándo el video AVPlayer termina de reproducirse?



avplayer swift (10)

Estoy usando AVPlayer para reproducir archivos de video locales (mp4) en Swift. ¿Alguien sabe cómo detectar cuándo el video termina de reproducirse? Gracias


2019

Es realmente así de simple

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

(Está bien que el objeto sea nulo).

y entonces

@objc func fileComplete() { print("IT''S DONE!") }


En Swift 3 y RxSwift 3.5 todo lo que tienes que hacer es:

override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.rx.notification(Notification.Name.AVPlayerItemDidPlayToEndTime) .asObservable().subscribe(onNext: { [weak self] notification in //Your action }).addDisposableTo(disposeBag) }


Para obtener AVPlayerItemDidPlayToEndTimeNotification su objeto debe ser un AVPlayerItem .

Para hacerlo, simplemente use la propiedad .currentItem en su AVPlayer

¡Ahora recibirás una notificación una vez que finalice el video!

Mira mi ejemplo:

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

No olvides quitar el observador en tu deinit

Swift 4, 5

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


Sé que hay muchas respuestas aceptadas aquí ...

Pero, otra ruta podría ser agregar un observador de tiempo límite a su AVPlayer. Tendría que tener la duración del video, que puede obtener de su player.currentItem , y luego agregarlo como su límite de tiempo deseado.

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 }


Swift 3.0

let videoPlayer = AVPlayer(URL: url) NotificationCenter.default.addObserver(self, selector:#selector(self.playerDidFinishPlaying(note:)),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem) func playerDidFinishPlaying(note: NSNotification){ //Called when player finished playing }


Versión Swift 4.2:

var player: AVPlayer! // // // Configure Player override 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 Observer deinit { NotificationCenter.default.removeObserver(self) }


Para SWIFT 3.0 Esto funciona bien

class PlayVideoViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PlayVideoViewController.finishVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTimeNotification, object: nil) } func finishVideo() { print("Video Finished") } }


Para SWIFT 3.0

Aquí ''fullUrl'' es la URL del video y asegúrese de que no haya espacio en la URL. Debe reemplazar ''Space'' con ''% 20'' para que la URL funcione.

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

Agregue esto debajo del método dado en su controlador de vista.

func playerDidFinishPlaying(){ print("Video Finished playing in style") }


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.0

Esta funciona para mí. Gracias a @Channel

private func playVideo(fileURL: String) { // Create RUL object let url = URL(string: fileURL) // Create Player Item object let playerItem: AVPlayerItem = AVPlayerItem(url: url!) // Assign Item to Player let player = AVPlayer(playerItem: playerItem) // Prepare AVPlayerViewController let videoPlayer = AVPlayerViewController() // Assign Video to AVPlayerViewController videoPlayer.player = player NotificationCenter.default.addObserver(self, selector: #selector(myViewController.finishVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil) // Present the AVPlayerViewController present(videoPlayer, animated: true, completion: { // Play the Video player.play() }) } @objc func finishVideo() { print("Video Finished") }