截图与录屏
mcpywrap 可以在不占用前台的情况下截取游戏画面,Windows 与 macOS 使用同一条命令。视频录制和逐帧提取只在 Windows 会话上可用,Mac 可以作为调用端通过远程使用。
mcpy --local --project <项目> --non-interactive screenshot --session <sid> --background-only --output <新的PNG路径> --json远程会话把 --local 换成 --remote <Windows HTTP endpoint>,返回的 image 是调用端路径。截图是游戏内容区的物理像素,不含系统标题栏。在联调组内操作时,请明确选择成员的 session。
不占用前台的任务请保留 --background-only。Windows 默认截图可能从 WGC 后台捕获回退到可见窗口;后台捕获失败时,不要去掉该参数、激活游戏,或用前台截图冒充后台结果。
macOS 要求
Section titled “macOS 要求”macOS 需要目标实例的运行包支持 screenshot_protocol=1,可通过 runtime capabilities --session <sid> --json 中的 screenshot 状态检查。旧包返回 capability_missing;更新 CLI 或 Skill 不会升级实例绑定的运行包,需要按 macOS 平台 选择支持该协议的运行包并新建实例。
macOS 截图的特点:
- 从 Launcher 按需读取下一帧,不需要屏幕录制授权,也不需要
runtime install; - 返回
capture=launcher-framebuffer、coordinate_space=game-content; - 图像去掉 Launcher 菜单栏及工具浮层,不含系统光标或桌面;
- 两种 background-only 设置都不抢前台,也不回退到桌面采集;
- 每个会话同时只处理一个请求,等待渲染最多约 5 秒,像素上限 16 MiPixels。
返回 busy 时请等待;返回 capture_timeout 时确认游戏是否仍在渲染。窗口最小化、锁屏或暂停渲染时不保证有新帧。
录制前先检查执行端是否有 record 和 record-frames 能力;bootstrap 可以重复传入 --require-capability。新版 Skill 不代表旧 CLI 或旧原生组件支持录制。视频在 Windows 临时目录中持续写入,再下载到调用端,不需要安装 FFmpeg。
一个典型流程:录制 10 秒,同时让玩家前进,然后下载视频并提取两帧。
mcpy --remote <endpoint> --project "<调用端项目>" --non-interactive record start --session <sid> --duration 10 --fps 30 --jsonmcpy --remote <endpoint> --project "<调用端项目>" --non-interactive runtime input run --session <sid> --file <移动计划.json> --jsonmcpy --remote <endpoint> --project "<调用端项目>" --non-interactive record status --session <sid> --recording <rid> --jsonmcpy --remote <endpoint> --project "<调用端项目>" --non-interactive record download --session <sid> --recording <rid> --output ./captures/clip.mp4 --jsonmcpy --remote <endpoint> --project "<调用端项目>" --non-interactive record frames --session <sid> --recording <rid> --frame 0 --frame 30 --output ./captures/frames --json移动计划:
{ "schema_version": 1, "steps": [{"action": "player.move", "forward": 1, "duration_ms": 2000}]}要点:
- 先完成
runtime install,再用runtime input observe确认处于 HUD 和玩家状态,输入用法见 统一输入。 - 保存
start返回的recording作为<rid>,后续保持同一个 endpoint、project 和 session。 start在首帧写入后返回,之后可以同时执行运行时动作。- 用
record status查询到completed后再下载或提帧。返回的video/images/manifest都是调用端路径。 - 在 Windows 本机执行时,把全局路由换成
--local --project "<Windows项目>",其余参数不变。
| 项目 | 规则 |
|---|---|
--duration |
整数 1–300 秒,默认 10 |
--fps |
整数 1–60,默认 30 |
| 音频 | 无 |
| 并发 | 每个会话同时一次录制 |
固定帧率的视频可能重复源画面,也可能跳过游戏呈现的画面,不能保证完整捕获每一帧;PNG 是编码后的画面。判断时请检查清单中的 frame / time / source_time / repeated,查看下载的 PNG,再结合日志。
time 是视频内的秒数;source_time 是 Windows 单调时钟秒数,不是 Unix 时间,原始值保存在 source_time_100ns。
高分辨率或高帧率可能超出机器的编码能力。遇到 encoder_too_slow 时降低帧率或使用较小的游戏窗口。
--frame从 0 开始,可重复,单次最多 100 个。- 也可以重复使用
--at <秒>,取floor(秒 × fps)对应的帧;--frame与--at互斥。 - 输出目录和 MP4 路径都必须不存在。
- 需要连续分析时分批选择帧,避免一次提取全部图片。
录制的生命周期
Section titled “录制的生命周期”| 状态 | 能否下载 |
|---|---|
starting / recording / finalizing |
不能 |
completed |
可以 |
failed / interrupted / cancelled |
没有可发布的视频 |
expired / deleted |
没有产物 |
- 提前结束用
record stop,不会停止游戏;游戏结束也会结束录制。短片如果成功封装仍可下载,请检查truncated/end_reason。 start超时时先用record status --session <sid> --list找回,不要盲目重录;显式传--request-id <32位小写hex>可以找回同一请求。- MP4 和提帧 ZIP 下载校验后才发布到调用端。断线可以重试到一个尚不存在的目标路径,不支持断点续传。
- 执行端产物完成后保留 24 小时,过期文件在后续命令或服务启动时清理;游戏退出后仍可下载。
- 文件下载完成后可以执行
record delete --session <sid> --recording <rid>,它只删除执行端的产物。
服务只接受归属该会话的录制 ID。