12.2 摄像头捕获

OpenClaw 支持在 iOS、Android 和 macOS 节点上通过 node.invoke 进行摄像头捕获,用于代理工作流。

概述

摄像头捕获功能允许 AI 代理访问设备摄像头,拍摄照片或录制视频片段。所有平台都需要在前台运行,后台调用会返回 NODE_BACKGROUND_UNAVAILABLE 错误。

iOS 节点

设置

  • 位置: Camera → Allow Camera
  • 配置项: camera.enabled
  • 默认值: 开启
  • 禁用响应: CAMERA_DISABLED

命令

camera.list - 列出相机设备

返回设备上所有可用的相机列表:

{
  "devices": [
    { "id": "...", "name": "...", "position": "front|back", "deviceType": "..." }
  ]
}

camera.snap - 拍摄照片

捕获单张照片:

  • facing - 相机方向: frontback
  • maxWidth - 最大宽度(像素)
  • quality - 质量 (0.0 - 1.0)
  • format - 格式: jpgpng
  • delayMs - 预热后延迟(毫秒)
  • deviceId - 特定设备 ID

返回:

{
  "format": "jpg",
  "base64": "<...>",
  "width": 1920,
  "height": 1080
}

负载 < 5 MB

camera.clip - 录制视频片段

录制短视频:

  • facing - 相机方向
  • durationMs - 持续时间(毫秒,≤ 60s)
  • includeAudio - 是否包含音频
  • format - 格式: mp4
  • deviceId - 特定设备 ID

返回:

{
  "format": "mp4",
  "base64": "<...>",
  "durationMs": 3000,
  "hasAudio": true
}

CLI 示例

# 拍摄照片
openclaw nodes camera snap --node <node-id>

# 录制 3 秒视频
openclaw nodes camera clip --node <node-id> --duration 3000

注意事项

  • 仅前台可用 - 后台返回 NODE_BACKGROUND_UNAVAILABLE
  • 照片负载重新压缩以保持 base64 < 5 MB

Android 节点

设置

  • 位置: Camera → Allow Camera
  • 配置项: camera.enabled
  • 默认值: 开启
  • 禁用响应: CAMERA_DISABLED

权限要求

  • CAMERA - 拍照和录像
  • RECORD_AUDIO - 录制带音频的视频片段

注意事项

  • 仅前台可用 - 后台返回 NODE_BACKGROUND_UNAVAILABLE
  • 照片重新压缩以保持 base64 < 5 MB

macOS 应用

设置

  • 位置: Settings → General → Allow Camera
  • 配置项: openclaw.cameraEnabled
  • 默认值: 关闭
  • 禁用响应: "Camera disabled by user"

CLI 示例

# 列出相机设备
openclaw nodes camera list --node <node-id>

# 录制无音频视频
openclaw nodes camera clip --node <node-id> --no-audio

注意事项

  • camera.snap 在预热后等待 delayMs 毫秒再捕获
  • 照片负载重新压缩以保持 base64 < 5 MB

macOS 屏幕录制

macOS 还支持屏幕录制功能:

# 录制 10 秒屏幕视频,15 fps
openclaw nodes screen record --node <node-id> --duration 10s --fps 15
权限要求
需要 macOS 屏幕录制权限 (TCC)

安全限制

  • 所有平台都需要操作系统权限提示(相机/麦克风)
  • 视频片段限制为 ≤ 60 秒以避免负载过大
  • 所有照片自动重新压缩以保持 base64 编码 < 5 MB
  • 所有命令仅在应用前台时可用

使用示例

在代理工作流中使用相机:

// 列出可用相机
const cameras = await node.invoke('camera.list');

// 拍摄后置相机照片
const photo = await node.invoke('camera.snap', {
  facing: 'back',
  maxWidth: 1920,
  quality: 0.85,
  format: 'jpg'
});

// 录制 5 秒视频片段
const clip = await node.invoke('camera.clip', {
  facing: 'front',
  durationMs: 5000,
  includeAudio: true,
  format: 'mp4'
});
提示
更多详情请参考 官方文档 - Camera Capture