摄像头拍摄
OpenClaw 支持在已配对的 iOS、Android、macOS 和 Linux 节点上为智能体工作流进行相机拍摄:通过 Gateway node.invoke 可拍摄照片(jpg)或短视频片段(mp4,可选择包含音频)。
当拍摄请求包含 deviceId 时,所选相机必须与该 ID 完全匹配。未知 ID 将直接失败,而不会从其他相机拍摄;运行 camera.list 可刷新设备 ID,相机重新连接后设备 ID 会发生变化。
macOS 应用还可以对受支持的 USB UVC 相机进行物理平移、倾斜和变焦操作。PTZ 移动的是相机硬件本身;它不会旋转、裁剪或以其他方式转换已拍摄的图像。
在每个平台上,所有相机访问权限均受用户可控设置的管控。
iOS 节点¶
iOS 用户设置¶
- iOS 设置标签页 → 相机 → 允许相机(
camera.enabled)。 - 默认值:开启(缺少该键时视为已启用)。
- 关闭时:
camera.*命令返回CAMERA_DISABLED。
iOS 命令(通过 Gateway node.invoke)¶
camera.list-
响应负载:
devices—{ id, name, position, deviceType }数组。 -
camera.snap - 参数:
facing:front|back(默认:front)maxWidth:数字(可选;默认1600)quality:0..1(可选;默认0.9,限制在[0.05, 1.0]范围内)format:jpg(唯一支持的值)delayMs:数字(可选;默认0,内部上限为10000)deviceId:字符串(可选;来自camera.list)
- 响应负载:
format: "jpg"、base64、width、height。 -
负载保护:照片会被重新压缩,以确保 base64 编码后的负载不超过 5MB。
-
camera.clip - 参数:
facing:front|back(默认:front)durationMs:数字(默认3000,限制在[250, 60000]范围内)includeAudio:布尔值(默认true)format:mp4(唯一支持的值)deviceId:字符串(可选;来自camera.list)
- 响应负载:
format: "mp4"、base64、durationMs、hasAudio。
iOS 前台运行要求¶
iOS 节点仅允许在前台执行 camera.* 命令。后台调用将返回 NODE_BACKGROUND_UNAVAILABLE。
CLI 辅助工具¶
获取媒体文件最简单的方式是使用 CLI 辅助工具,它会将解码后的媒体写入临时文件并打印保存路径。
openclaw nodes camera snap --node <id> # default: one node-selected photo
openclaw nodes camera snap --node <id> --facing front
openclaw nodes camera snap --node <id> --facing both # front then back (2 saved paths)
openclaw nodes camera clip --node <id> --duration 10s
openclaw nodes camera clip --node <id> --no-audio
--duration 接受纯毫秒数字(3000)或带单位后缀的值(10s、1m、1h30m)。默认值为 3000(3 秒)。
不带 --facing 时,nodes camera snap 使用节点默认相机拍摄一张照片,并将保存的产物标记为 unknown。在非 Linux 节点上,--facing both 会先拍摄前置再拍摄后置,并打印两个保存路径。--device-id 在不带 --facing 时有效;在非 Linux 节点上,它不能与 --facing both 组合使用。Linux 始终发送一个不带 facing 的请求,并将产物标记为 unknown,无论是否指定 --facing。除非你构建自己的包装器,否则输出文件是临时的(位于操作系统临时目录中)。
Android 节点¶
Android 用户设置¶
- Android 设置面板 → 相机 → 允许相机(
camera.enabled)。 - 全新安装默认关闭。 早于该设置存在的现有安装会被迁移为开启,这样升级后不会静默丢失原本可用的相机访问权限。
- 关闭时:
camera.*命令返回CAMERA_DISABLED: enable Camera in Settings。
权限¶
camera.snap和camera.clip都需要CAMERA权限;缺少/拒绝权限时返回CAMERA_PERMISSION_REQUIRED。- 当
includeAudio为true时,camera.clip需要RECORD_AUDIO权限;缺少/拒绝权限时返回MIC_PERMISSION_REQUIRED。
应用会在可能的情况下提示授予运行时权限。
Android 前台运行要求¶
Android 节点仅允许在前台执行 camera.* 命令。后台调用将返回 NODE_BACKGROUND_UNAVAILABLE: command requires foreground。
Android 命令(通过 Gateway node.invoke)¶
camera.list-
响应负载:
devices—{ id, name, position, deviceType }数组。 -
camera.snap - 参数:
facing(front|back,默认front)、quality(默认0.95,限制在[0.1, 1.0]范围内)、maxWidth(默认1600)、deviceId(可选;未知 ID 将返回INVALID_REQUEST失败)。 - 响应负载:
format: "jpg"、base64、width、height。 -
负载保护:重新压缩以保持 base64 不超过 5MB(与 iOS 相同的大小上限)。
-
camera.clip - 参数:
facing(默认front)、durationMs(默认3000,限制在[200, 60000]范围内)、includeAudio(默认true)、deviceId(可选)。 - 响应负载:
format: "mp4"、base64、durationMs、hasAudio。 - 负载保护:原始 MP4 在 base64 编码前上限为 18MB;超大的片段将返回
PAYLOAD_TOO_LARGE失败(请减小durationMs后重试)。
macOS 应用¶
macOS 用户设置¶
macOS 配套应用提供了一个复选框:
- 设置 → 通用 → 允许相机(
openclaw.cameraEnabled)。 - 默认值:关闭。
- 关闭时:相机请求返回
CAMERA_DISABLED: enable Camera in Settings。
CLI 辅助工具(节点调用)¶
使用主 openclaw CLI 在 macOS 节点上调用相机命令。
openclaw nodes camera list --node <id> # list camera ids
openclaw nodes camera snap --node <id> # prints saved path
openclaw nodes camera snap --node <id> --max-width 1280
openclaw nodes camera snap --node <id> --delay-ms 2000
openclaw nodes camera snap --node <id> --device-id <id>
openclaw nodes camera clip --node <id> --duration 10s # prints saved path
openclaw nodes camera clip --node <id> --device-id <id>
openclaw nodes camera clip --node <id> --no-audio
- 除非另行覆盖,
openclaw nodes camera snap默认使用maxWidth=1600。 camera.snap在预热/曝光稳定后等待delayMs(默认 2000ms,限制在[0, 10000]范围内)再进行拍摄。- 照片负载会重新压缩,以保证 base64 数据保持在 5MB 以下。
如果 macOS 外接摄像头以竖屏方向启动照片会话,OpenClaw 会在存在对应格式时,选择一种已公布的横屏格式,其尺寸转置且编码相同。已是横屏的格式、内置摄像头格式以及 Continuity Camera 格式均保持不变。若没有完全对应的格式,或摄像头无法重新配置,拍摄将保持协商后的格式。--max-width 仍然只限制返回的 JPEG 宽度;它不会选择摄像头格式。
macOS 物理 PTZ¶
物理 PTZ 由 Mac 应用为暴露标准 UVC 绝对 pan/tilt 或 zoom 控制的 USB 摄像头实现。它使用与拍摄相同的 Allow Camera 设置。其他节点平台不公布这些命令。
始终传入 camera.list 返回的显式 deviceId。OpenClaw 绝不会为物理移动选择默认摄像头。
camera.ptz.status在不移动摄像头的情况下读取当前位置。请求:{ "deviceId": "<camera-id>" }。- 响应在
axes下仅包含可执行的pan、tilt和zoom轴。 - Pan 和 tilt 值的单位是度。Zoom 值的单位是百分比。
- 每个轴报告
current、min、max、step、unit、canSet和canMove。仅当摄像头成功报告设备默认值时,default才会出现。 - 仅当所有对外暴露且可执行的轴都有真实的设备公布默认值时,
canHome才为 true,此时才能尝试完整的归位计划。 camera.ptz.control更改摄像头硬件。其支持的操作如下:{ "deviceId": "<camera-id>", "operation": "set", "target": { "panDegrees": 10, "tiltDegrees": -5, "zoomPercent": 40 } }{ "deviceId": "<camera-id>", "operation": "move", "delta": { "panDegrees": 2, "zoomPercent": -5 } }{ "deviceId": "<camera-id>", "operation": "home" }
set 和 move 至少需要一个有穷的轴值。省略的轴保持不变,move 中 zoom 的增量以百分点为单位。home 恢复设备公布默认值;当 canHome 为 false 时,它返回 CAMERA_PTZ_UNSUPPORTED 且不移动摄像头。Mac 应用会将请求值限制并对齐到摄像头的范围和分辨率;响应返回操作后的 state,并在 adjusted 中列出被更改的请求字段。请求不支持的轴会返回 CAMERA_PTZ_AXIS_UNSUPPORTED。
两个 PTZ 命令都会短暂打开实时摄像头流,因为受支持的摄像头仅在流式传输期间提供 UVC 控制服务。这会在该期间激活摄像头及其隐私指示灯,包括 camera.ptz.status 仅读取位置时也是如此。帧不会被保留,也不会生成任何照片、视频或文件。
Pan/tilt 和 zoom 使用独立的硬件写入操作,无法保证原子性。OpenClaw 会通过一条全新的控制连接验证最终位置。如果后续写入或最终状态读取失败,或者某个轴未能在摄像头报告的分辨率范围内到达请求位置,CAMERA_PTZ_PARTIAL 会列出已确认的控制组,在可读取时包含独立观测到的状态,并告知调用方在重试前先运行 camera.ptz.status。位置失败还会报告请求值和观测值;请检查是否有视频流到达摄像头,并禁用可能覆盖 UVC 控制的摄像头端 AI 构图或跟踪功能。
camera.ptz.control 属于危险命令,在操作员将其显式添加到 gateway.nodes.commands.allow 之前,它始终保持未启用状态:
仅添加 allow 条目并不会扩展现有的节点批准范围。在更新后的 Mac 重新连接并声明支持 PTZ 控制后,运行 openclaw nodes pending,然后使用 openclaw nodes approve <requestId> 批准扩展后的能力面。
在智能体的 nodes 工具中,使用 action: "camera_ptz"、选定的 Mac 节点、deviceId 以及 ptzOperation: "status" | "set" | "move" | "home"。轴输入为 panDegrees、tiltDegrees 和 zoomPercent。
Linux 节点主机¶
捆绑的 Linux Node 插件为 CLI 的 openclaw node 服务增加了摄像头拍摄功能。它可在无头主机上运行,且不需要 Linux 桌面应用。
摄像头访问默认关闭。在插件条目下启用它,然后重启节点服务,以便重新构建其 Gateway 通告:
要求:
- 支持 V4L2 输入、
libx264和 AAC 的 FFmpeg - 节点服务用户可读取的
/dev/video*设备;在常见发行版中,将该用户添加到video组 - 对于使用默认
includeAudio: true的片段,需要可用的 PulseAudio 服务器,或带有默认源的 PipeWire PulseAudio 兼容层
Linux 从 camera.list 返回可拍摄且可读的 V4L2 设备路径;FFmpeg 会探测每个 /dev/video* 候选设备,并忽略元数据节点或仅输出节点。设备 position 为 unknown,因此未携带 deviceId 的指定朝向请求会生成位置为 unknown 的照片或片段,而不会声称是前置或后置摄像头。当主机有多个摄像头时,请使用 deviceId。camera.snap 在 delayMs 期间使用 FFmpeg 输入预热,并在限制宽度的同时保持宽高比。camera.clip 将麦克风音频录制为 MP4 音轨;OpenClaw 有意不暴露独立的麦克风命令。
该插件使用 libx264 编码 MP4 视频,并且不会静默更改编解码器。缺少所需输入或编码器的 FFmpeg 构建会返回 CAMERA_UNAVAILABLE。照片和片段若超过 25MB 的 base64 负载预算,将以 PAYLOAD_TOO_LARGE 失败。
camera.snap 和 camera.clip 仍属于危险命令。仅在您打算启用拍摄时,才将它们添加到 gateway.nodes.commands.allow;仅启用插件并不会绕过 Gateway 策略。
安全与实际限制¶
- 访问摄像头和麦克风会触发常规的操作系统权限提示(并且需要在
Info.plist中提供用途说明字符串)。 - 视频片段上限为 60 秒,以避免节点有效载荷过大(base64 开销加上消息大小限制)。
macOS 屏幕视频(系统级)¶
对于_屏幕_视频(非摄像头),请使用 macOS 配套工具:
需要 macOS 屏幕录制 权限(TCC)。
相关链接¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw