我刚开始使用TVOS,想知道是否有人解决了TVOS / TVJS / TVML中的循环问题。我正在使用this tutorial创建用于播放视频的简单界面。我的皱纹是我希望这些视频以连续的无缝循环播放-基本上是一种移动屏保类型的效果-参见art.chrisbaily.com的示例视频。
是否有一种简单的方法可以执行此操作,或者我需要构建某种事件侦听器来手动执行循环?我希望这些视频具有很高的分辨率,并且这些视频将在1到3分钟之间。
我也在寻找这个问题的答案。并且发现唯一可行的方法是创建一个事件侦听器并将重复的媒体项添加到播放列表。但是说实话,如果您遵循帖子中列出的教程,这并不难。
所以代码将类似于
player.playlist = playlist;
player.playlist.push(mediaItem);
//Again push the same type of media item in playlist so now you have two of the same.
player.playlist.push(mediaItem);
player.present();
这将确保您的第一个视频结束后,第二个视频开始播放,这实质上是一个循环。然后对于第三个事件,然后使用“ mediaItemWillChange”属性实现事件侦听器。这样可以确保在视频结束后,将同一视频的新副本添加到播放列表中。
player.addEventListener("mediaItemWillChange", function(e) {
player.playlist.push(mediaItem);
});
只需在使用启动播放器之前放置事件监听器
player.present();
请注意,这种问题和这种想法已经在苹果的讨论板上提出/提出了。我只是接受了这个想法,并在我自己的项目中实现了它,现在知道它可行了,因此我正在发布解决方案。我发现,如果我从播放列表中弹出第一个视频并进行添加,然后按照下面的链接主题中所述在播放列表中推送新视频,则我的视频不会循环播放。以下是原始帖子的链接。
确实不需要将第二个媒体项目推到该项目上。只需收听媒体到达终点,然后将搜索时间设置回零即可。这是代码。
播放媒体。
private func playVideo(name: String) {
guard name != "" else {
return
}
let bundle = NSBundle(forClass:object_getClass(self))
let path = bundle.pathForResource(name, ofType:"mp4")
let url = NSURL.fileURLWithPath(path!)
self.avPlayer = AVPlayer(URL: url)
if (self.avPlayerLayer == nil) {
self.avPlayerLayer = AVPlayerLayer(player: self.avPlayer)
self.avPlayerLayer.frame = previewViews[1].frame
previewViews[1].layer.addSublayer(self.avPlayerLayer)
avPlayer.actionAtItemEnd = .None
//Listen for AVPlayerItemDidPlayToEndTimeNotification
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.avPlayer.currentItem)
}
avPlayer.play()
}
再次播放
func playerItemDidReachEnd(notification: NSNotification) {
let item = notification.object as? AVPlayerItem
item?.seekToTime(kCMTimeZero)
}
您还可以在播放列表对象上设置repeatMode
player.playlist.repeatMode = 1;