【问题标题】:Continuous Looping Video in TVOS?TVOS 中的连续循环视频?
【发布时间】:2015-11-12 17:40:52
【问题描述】:
我刚开始使用 TVOS,想知道是否有人解决了 TVOS/TVJS/TVML 中的循环问题。我正在使用this tutorial 创建一个简单的视频播放界面。我的问题是我希望这些视频以连续的无缝循环播放 - 基本上是一种移动的屏幕保护类型效果 - 请参阅 art.chrisbaily.com 的示例视频。
有没有一种简单的方法可以做到这一点,或者我是否需要构建某种事件监听器来手动执行循环?我希望视频的分辨率相当高,视频长度在 1 到 3 分钟之间。
【问题讨论】:
标签:
xcode
video
tvos
tvml
tvjs
【解决方案1】:
我也在寻找这个问题的答案。并发现唯一可行的方法是创建一个事件侦听器并将重复的媒体项添加到播放列表中。但老实说,如果您按照帖子中列出的教程进行操作,这并不难。
所以代码应该是这样的
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 的讨论板上已经提出/提供了此类问题和想法。我只是接受了这个想法并在我自己的项目中实现了它,现在知道它有效,我正在发布解决方案。我发现如果我从播放列表中弹出第一个视频并添加然后在播放列表中推送一个新视频,如下面的链接线程中所述,我的视频不会循环播放。以下是原帖的链接。
How to repeat video with TVJS Player?
【解决方案2】:
您也可以在播放列表对象上设置 repeatMode
player.playlist.repeatMode = 1;
- 0 = 不重复
- 1 = 重复播放列表中的所有项目
- 2 = 重复当前项目
【解决方案3】:
真的没有必要将第二个媒体项目推到上面。只需听媒体到达终点,然后将寻道时间设置回零。这是代码。
播放媒体。
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)
}