Comment faire une boucle video avec AVPlayerLooper

J'essaie de faire une boucle dans une application TV OS avec l' AVPlayerLooper car cela devrait supprimer la pause / hicup lors de la lecture de la video. J'ai regardé la video WWDC2016 https://developer.apple.com/videos/play/wwdc2016/503/ et j'essaie d'implémenter le code mais il ne boucle pas. J'ai un PlayerViewController qui hérite de AVPlayerViewController . J'ai mis le code pour laisser la boucle video. Si j'ai le code suivant, cela ne montre rien. Si je change la deuxième ligne en self.queuePlayer = AVQueuePlayer(playerItem:playerItem) , elle ne joue qu'une fois.

  let playerItem = AVPlayerItem(url: url as URL) self.queuePlayer = AVQueuePlayer() //I declared this as a variable in the view controller self.playerLayer = AVPlayerLayer(player: self.queuePlayer) //I declared this as a variable in the view controller let playerLooper = AVPlayerLooper(player: self.queuePlayer!, templateItem: playerItem) self.view.layer.addSublayer(self.playerLayer!) self.playerLayer?.frame = self.view.frame self.queuePlayer?.play() 

AVPlayerLooper d'entre vous ont-ils réussi à lire des videos en boucle avec le dernier AVPlayerLooper ?

J'ai corrigé le problème moi-même.

Le playerLooper doit être une variable membre de la class, sinon elle ne fonctionne pas car une variable locale a disparu après l'appel de la méthode. J'ai donc mis cette ligne au début de la class pour la déclarer. Je ne l'ai pas déclaré comme un AVPlayerLooper car c'est seulement pour les versions de tvos10.0 et plus récentes. Je veux que ma class soit adaptative à tvos9.0. C'est mon code de travail.

 var playerLooper: NSObject? var playerLayer:AVPlayerLayer! var queuePlayer: AVQueuePlayer? func playVideo(_ filmName: Ssortingng){ if let path = Bundle.main.path(forResource: filmName, ofType: "mov") { let url = URL(fileURLWithPath: path) if #available(tvOS 10.0, *) { // Use a new player looper with the queue player and template item let playerItem = AVPlayerItem(url: url as URL) self.player = AVQueuePlayer(items: [playerItem]) self.playerLayer = AVPlayerLayer(player: self.player) self.playerLooper = AVPlayerLooper(player: self.player! as! AVQueuePlayer, templateItem: playerItem) self.view.layer.addSublayer(self.playerLayer!) self.playerLayer?.frame = self.view.frame self.player?.play() } else { // Fallback on earlier versions, this solution has hicup at end player = AVPlayer(url: url) player?.play() loopVideo(player!) } } } func loopVideo(_ videoPlayer: AVPlayer) { NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil, queue: nil) { notification in if(!self.isStopped){ videoPlayer.seek(to: kCMTimeZero) videoPlayer.play() } } }