我刚刚开始使用 TVOS,想知道是否有人解决了 TVOS/TVJS/TVML 中的循环问题。我正在使用本教程创建一个用于播放视频的简单界面。我的问题是我希望这些视频以连续的无缝循环播放——基本上是一种移动的屏幕保护类型效果——请参阅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();
请注意,Apple 的讨论板上已经询问/提供了此类问题和想法。我只是接受了这个想法并在我自己的项目中实现了它,现在知道它有效,我正在发布解决方案。我发现如果我从播放列表中弹出第一个视频并添加然后在播放列表中推送一个新视频,如下面的链接线程中所述,我的视频不会循环播放。以下是原始帖子的链接。
您还可以在播放列表对象上设置 repeatMode
player.playlist.repeatMode = 1;
真的没有必要将第二个媒体项目推到上面。只需听媒体到达终点,然后将寻道时间设置回零。这是代码。
播放媒体。
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)
}