这是一个专为 ComputerCraft (CC: Tweaked) 设计的视频播放器客户端。它依赖 Tom's Peripherals 的 tm_gpu 进行画面解码与渲染,并通过远程服务器完成视频抽帧和音频转码,从而在 Minecraft 中播放网络视频。
✨ 主要功能
- 在线转码:输入视频 URL 后,服务端异步创建任务,提取画面帧并生成 DFPWM 音频。
- 任务重播:也可以直接传入已有
task_id,跳过重新提交任务的步骤。 - GPU 渲染:使用
tm_gpu解码并绘制每一帧图像。 - 音频分轨播放:自动拉取主音频、左声道、右声道,并调用
speakerlib.lua播放。 - 前置预缓存:正式播放前先并发下载最多前 20 秒画面数据。
- 边播边缓冲:播放过程中持续预取后续约 20 秒的帧包,并对失败请求自动重试。
- 调试信息:
-debug模式下会显示帧进度、实时 FPS、渲染耗时、当前分辨率和任务 ID。
🛠️ 环境要求
在运行此程序之前,请确保环境满足以下条件:
- 模组要求:
CC: TweakedTom's Peripherals
- 硬件要求:
- 一台 ComputerCraft 电脑。
- 一个
tm_gpu外设。默认会自动查找,也可以用-gpu <id>指定。 - 与 GPU 相连的显示设备。
- 扬声器外设,用于音频播放。
- 网络要求:
- 电脑需要可以访问默认 API 服务,或你自己指定的
-server地址。
- 电脑需要可以访问默认 API 服务,或你自己指定的
📥 安装
wget https://git.liulikeji.cn/xingluo/computer_craft_video_play/raw/branch/main/play.lua
首次运行时,程序会在当前目录自动检查并下载以下依赖:
speakerlib.luacc_big_http.lua
🚀 使用方法
命令格式:
play <视频 URL 或 task_id> [options]
支持的参数:
-debug:开启调试信息显示。-auto:根据 GPU 黑白分辨率自动计算合适的Size。-h/-high:使用rgb24高彩模式,默认是pal8需要较大网络带宽。-size <N>:手动指定 GPU Size,范围1-64,默认64。-gpu <id>:指定要使用的 GPU 外设 ID。-server <URL>:指定 API 服务地址,默认https://newgmapi.liulikeji.cn。-help:显示帮助信息。
1. 播放新视频
直接传入视频链接:
play https://example.com/video.mp4
程序会先向服务端提交异步任务,然后轮询任务状态。服务端开始产出音频和视频帧后,客户端会先预缓存一段数据,再开始播放。
2. 通过 ID 重播
如果你已经有现成的 task_id,可以直接播放该任务:
play 20116713
程序不会重新创建任务,而是直接查询该任务状态并尝试播放。是否还能重播取决于服务端是否仍然保留这份任务数据。
3. Debug 调试模式
在 URL 或 ID 后添加 -debug:
play https://example.com/video.mp4 -debug
Debug 信息说明:
100/5000/3200:当前播放帧 / 总帧数 / 服务端当前已生成帧数。A:20(50ms):最近一段时间内的平均 FPS 与平均单帧耗时。L:15(66ms):最近一段时间内的最低 FPS 与最大单帧耗时。%dx%d Size:%d:当前请求的视频分辨率和 GPU Size。
⚙️ 技术细节
- API 服务端:默认连接
https://newgmapi.liulikeji.cn,可通过-server替换。 - 提交参数:新任务固定以
20 FPS请求服务端处理,并启用pad_to_target = true。 - 分辨率策略:
- 默认先将 GPU Size 设为
64。 - 如果启用
-auto,程序会根据 GPU 的黑白尺寸估算更合适的 Size,使目标分辨率尽量接近640x360。 - 最终提交给服务端的是 GPU 当前实际像素宽高
w、h。
- 默认先将 GPU Size 设为
- 预缓存机制:
- 播放前最多先下载
20秒数据,也就是最多400帧。 - 帧数据按每批
10帧的FramePack二进制包获取。
- 播放前最多先下载
- 运行时缓冲:
- 播放时会持续保证当前帧后约
20秒的缓存窗口。 - 请求失败时会最多重试
3次。 - 过旧的批次会被直接丢弃,避免无意义回填。
- 播放时会持续保证当前帧后约
- 同步策略:根据播放时间计算理论帧位;当实际帧与理论帧偏差过大时会主动跳帧追赶。
- 错误输出:任务状态变为
error时如果为debug模式,会在程序目录写出error.log。
❓ 常见问题
Q: 画面流畅,但声音卡顿或不同步?
A: 扬声器播放本身受 Minecraft 服务器 TPS 和外设调度影响。play.lua 会根据播放时间自动追帧,偏差较大时直接跳帧以追上音频,但这不能消除服务端卡顿或扬声器端吞吐不足的问题。
Q: 如何获取任务 ID?
A: 视频播放完毕后,控制台会输出:The ID for playing the video is XXXXX 或直接查看屏幕左上角ID号
Q: 出现 Response is too large 怎么办?
A: 这通常说明单次帧包超过了 ComputerCraft HTTP 的大小限制。优先尝试减小 -size,或者不要使用 -h 高彩模式。
Q: 播放过程中提示没有可用视频数据?
A: 这表示缓冲持续跟不上播放速度。可以检查网络连通性,改用更低的 -size,或者切回默认 pal8 模式降低带宽压力。
