自从 Minecraft 诞生以来,其引擎一直…可以说是非常有趣。它似乎缺少许多标准功能,比如 GPU 网格缓存,在这种情况下,就是简单的视频播放。这个模组旨在弥补这一点,为模组制作者提供一个干净的 API,以在其模组中实现预渲染视频播放。
*注意:这个模组本身不提供任何功能。它只是其他模组可以利用的库。
设置
一旦设置好 Maven 依赖关系,就会提供一个安装指南。值得注意的是,默认实现需要用户系统中安装 VLC 媒体播放器。
使用方法
要使用 VideoLib,您必须获得一个 `VideoManager` 的引用。这个视频管理器是与该库所有交互的基础,对于模组的功能至关重要:
VideoManager videoManager = VideoLib.getInstance().getVideoManager();
已复制!
`VideoManager` 可以用于创建多个 `VideoPlayer`。由于视频播放的性能开销,每个视频播放器都使用唯一的 ID 在视频管理器中注册。只有视频管理器可以创建新的 `VideoPlayer` 实例。
VideoPlayer videoPlayer = videoManager.getOrCreate(new Identifier("mymod", "my_video_player"));
已复制!
每个 `VideoPlayer` 都有一个 `getTexture()` 函数,返回一个 Minecraft 纹理标识符,可用于实体渲染器(或任何其他非图集纹理使用的地方)。这个纹理会为视频的每一帧自动更新,并且可以像任何其他纹理一样应用。
Identifier texture = videoPlayer.getTexture();
VertexConsumer consumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutout(texture));
// render geometry however you want
已复制!
视频指示
有许多方法可以指示视频播放,但大多数都与 `VideoHandle` 有关。视频指示本质上是指向存储在外部位置的视频文件的指针,无论是在本地磁盘还是在互联网上。要创建 `VideoHandle`,您需要一个 `VideoHandleFactory`。这可以从 `VideoManager` 获取。
需要注意的是,并非所有视频指示都适用于所有视频管理器。请确保只使用视频管理器工厂提供的视频指示。(大多数 API 函数已经做到了这一点)。
VideoHandleFactory factory = videoManager.getVideoHandleFactory();
已复制!
`VideoHandleFactory` 提供了两种主要功能:`getVideoHandle(Identifier)` 和 `getVideoHandle(URL)`。
- `getVideoHandle(Identifier)` 需要视频文件的资源标识符来自任何模组。这个文件必须在你的资源包的 `videos` 文件夹中。(例如:`mymod:videos/myvideo.mp4`)
- `getVideoHandle(URL)` 需要指定视频的 URL。这可以是在互联网上或本地文件系统上找到视频的 URL。(例如:`
链接 `)。这个文件必须可以通过 `GET` 请求直接访问。不允许使用谷歌云盘链接和其他用户必须导航到下载页面的服务。
然后可以将视频指示传递给视频播放器以进行播放。
VideoHandle idHandle = factory.getVideoHandle(new Identifier("mymod", "videos/myvideo.mp4"))
VideoHandle urlHandle = factory.getVideoHandle(new URL("http://mywebsite.com/myvideo.mp4"));
videoPlayer.getMediaInterface().play(idHandle);
已复制!
媒体播放器还提供了 `play()` 的重载版本,直接接受标识符和 URL。这只是创建视频指示并播放它们的快捷方式。
播放控制
视频播放器提供一组接口,允许对媒体播放进行更精细的控制:`MediaInterface`、`ControlsInterface` 和 `CodecInterface`。可以按如下方式访问这些接口:
MediaInterface mediaInterface = videoPlayer.getMediaInterface();
ControlsInterface controlsInterface = videoPlayer.getControlsInterface();
CodecInterface codecInterface = videoPlayer.getCodecInterface();
已复制!
这三个接口提供了多种必要功能,如 `pause`、`play` 和 `setTime`。关于这些 API 功能的详细信息可以在 javadoc 中找到。
事件
VideoLib 提供了许多在视频播放过程中在特定事件触发的回调。无论它们在本机代码中的触发位置如何,所有事件监听器都在 Minecraft 客户端线程上调用。
VideoEvents events = videoPlayer.getEvents();
events.onBuffering(e -> {
LogManager.getLogger().info("缓冲中!");
})
已复制!
和播放接口一样,事件函数在 javadoc 中有详细说明。
许可证说明
VideoLib 的默认实现依赖于 VLCJ,它是在 GNU GPL 下许可的。这意味着 `vlc` 包中的所有内容都是在 GPL 下许可的。然而,存储库的其余部分,只要不直接依赖于 `vlc` 包,都是根据 MIT 许可进行的。此外,`vlc` 包不被视为公共 API 的一部分,并且可能会在以后移动到一个单独的 Gradle 项目中。
计划功能
- 音频控制。
- 目前,VLC 直接将音频传输到操作系统中,完全绕过了 Minecraft。我打算改变这一点。
- 标准化支持的格式。
- 当 VideoLib 初始化失败时(通常是由于缺少本机文件),向用户发出警告。
- 渲染实用函数。
Initial Beta
收录