用途:录制确定性的游戏画面、过场动画或渲染测试证据,将无头 Camera2d/Camera3d 的输出保存为 MP4、GIF 或编号 PNG。bevy_capture = "0.6" 原生面向 Bevy 0.19,不要沿用 0.4.x 的 Bevy 补丁或其旧 CameraTargetHeadless API。
主要能力与编码器选择:Mp4Openh264Encoder(特性 mp4_openh264,无需外部程序,进程内 H.264);Mp4FfmpegCliEncoder(mp4_ffmpeg_cli,需 ffmpeg,适合短片/离线片段);Mp4FfmpegCliPipeEncoder(mp4_ffmpeg_cli_pipe,需 ffmpeg,适合长时流式捕获);GifEncoder(特性 gif,无需外部程序,适合小预览);FramesEncoder(无需特性,无损 PNG 序列)。
使用方式:依赖中启用 bevy "0.19" 与 bevy_capture 0.6,并勾选所需特性,例如 bevy_capture = { version = "0.6", features = ["mp4_openh264"] }。在 App 中加入 CapturePlugin,可配合 DefaultPlugins 禁用 WinitPlugin、设置 RenderPlugin 的 synchronous_pipeline_compilation: true,并用 ScheduleRunnerPlugin 的 RunMode::Loop { wait: None } 驱动。把 Camera2d/Camera3d、RenderTarget::target_headless(WIDTH.into(), HEIGHT.into(), &mut images) 与 CaptureBundle::default() 挂到同一实体;至少等待一帧后再调用 capture.start(encoder),结束时用 capture.stop() 收尾。
限制与注意:RenderTargetHeadless 实现在 RenderTarget 上,需调用 RenderTarget::target_headless(...),Camera 上的旧助手已过时;编码器模块由特性开关控制,只启用实际导入的特性;stop() 或丢弃 Capture 才会完成编码,进程被强行终止可能留下无效 MP4/GIF;ffmpeg 编码器要求 PATH 中有 ffmpeg,构造器返回 Result;编码尺寸需与无头目标一致,OpenH264 使用 u16;浏览器 WASM 没有常规文件系统或子进程,需自行设计 JS 下载/流式路径。