如何用AVPlayerLooper循环播放video

我尝试使用AVPlayerLooper在电视操作系统应用程序中循环播放video,因为在再次播放video时,应该消除暂停/启动。 我观看了WWDC2016videohttps://developer.apple.com/videos/play/wwdc2016/503/并尝试实现代码,但不会循环。 我有一个PlayerViewControllerinheritanceAVPlayerViewController 。 我把代码让video循环。 如果我有下面的代码,它什么都不显示。 如果我把第二行self.queuePlayer = AVQueuePlayer(playerItem:playerItem) ,它只会播放一次。

  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播放循环video?

我自己解决了这个问题。

playerLooper必须是类中的成员variables,否则它不起作用,因为在调用该方法后局部variables不见了。 所以我把这一行放在课程的开始处宣布它。 我没有把它声明为AVPlayerLooper,因为这只适用于tvos10.0和更新的版本。 我希望我的课程适应tvos9.0。 这是我的工作代码。

 var playerLooper: NSObject? var playerLayer:AVPlayerLayer! var queuePlayer: AVQueuePlayer? func playVideo(_ filmName: String){ 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() } } }