VisionClaw的"眼睛":从24fps到1fps,让AI看见你世界的完整视频管道设计
【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice + vision + agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClaw
VisionClaw 是一款面向 Meta Ray-Ban 智能眼镜的实时 AI 视觉助手,它的核心视频管道会将眼镜 24fps 的高帧率画面逐级节流到约 1fps,经 JPEG 压缩后通过 WebSocket 送入 Gemini Live 多模态模型,让 AI"边听你说话,边看见你的世界"。本文带你拆解这条完整视频管道的每一层设计。
为什么 1fps 就够了?AI"视觉"的底层逻辑
直觉上,实时视频就该实时传输——但给大模型喂画面时恰恰相反。视觉模型读的是静态图像而非运动视频:它理解"你在看一盏吊灯"并不依赖每秒 24 张连续画面,只需要一张清晰、最新的帧。
把 24fps 原样送进模型,代价是带宽、压缩计算和 API 成本的 24 倍放大,收益却接近于零。所以 VisionClaw 的核心设计哲学是:在管道的每一层都问一句"模型真的需要这一帧吗?",答案是"不"时果断丢弃。
第一级:眼镜端采集,24fps + HEVC 是蓝牙链路的关键
眼镜里的摄像头由 Meta 官方 DAT SDK 驱动,画面经经典蓝牙链路传到手机。蓝牙带宽有限,这里有两个关键设计(见 StreamSessionViewModel.swift):
| 设计点 | 选择 | 原因 |
|---|---|---|
| 视频编码 | HEVC(hvc1),720x1280 | 裸 NV12 每帧约 1.38MB,HEVC 比它小 10~30 倍 |
| 请求帧率 | 从 2/7/15/24/30 中选 | SDK 只接受这几个合法值,逐帧压缩自适应适配蓝牙预算 |
解码侧同样讲究:VideoDecoder.swift 用VTDecompressionSession在后台解码压缩帧,避免每帧软件转码拖垮主线程——这正是"24fps 能不能流畅"的分水岭。
第二级:应用层节流,24fps 变 1fps + JPEG 50% 质量
画面进入 App 后立刻被"降采样":约 1fps 抽帧 → 压缩为 50% 质量的 JPEG → 经 WebSocket 发给 Gemini Live(管道全貌可参考 README.md 的架构图)。
- 眼镜模式:DAT SDK 24fps → 节流至 ~1fps → JPEG(50%)
- 手机模式:手机后置摄像头 30fps(PhoneCameraManager.kt)→ 同样节流至 ~1fps
50% 的 JPEG 质量是刻意选择:AI 读场景不要求摄影级画质,而每降低 10% 质量,一帧的字节数就省下一截。一天几百次对话下来,这层节流省下的流量非常可观。
第三级:Agent 端动态采样——说话 1fps,沉默 0.3fps
真正喂给模型的"最后一道闸门"在 agent/main.py。这里有一个巧妙的VoiceActivityVideoSampler:
- 用户说话时:按1fps采样画面——AI 正在理解你的问题,需要跟上视线变化
- 用户沉默时:降到0.3fps——画面基本静止,少看几帧也不影响
配合FrameHolder(永远只保留最新一帧)与帧新鲜度检测(stale 时记录帧龄),模型看到的永远是"当前世界的最新快照"。最终帧被编码为最长边 1280px 的 JPEG + base64,附在会话里送入模型。
进阶技巧:画面"冻结"——让模型只看你钉住的那一帧
VisionClaw 还有一个反直觉的功能(见 LiveKitSession.swift):长按画面可以"钉住"当前帧。
此时屏幕显示该帧,同时发布给模型的轨道被静音——模型不再收到任何新帧,因此"你眼前这张图"永远是你钉住的那张。当你指着某个细节问"这个字写的什么?"时,模型的注意力就稳定锁定在那个瞬间,不会被后续走动中模糊的画面带偏。
音频与视频管道如何协同
视频只是"眼睛",声音才是这条管道的脉搏。整个实时链路长这样:
| 通道 | 方向 | 格式 | 说明 |
|---|---|---|---|
| 麦克风音频 | 手机 → 模型 | PCM 16kHz | 100ms 分块,实时进 WebSocket |
| 摄像头画面 | 手机 → 模型 | JPEG ~1fps | 本文的主角 |
| 模型语音 | 模型 → 手机 | PCM 24kHz | 原生语音输出,非 TTS 拼接 |
音频是全速双向的,视频却只要 1fps——因为语音对话的节奏(每几百毫秒一个词)对延迟敏感,而场景理解("你在看什么")天然只按秒变化。用帧率匹配任务的感知粒度,这条原则值得所有做多模态 App 的人借鉴。
顺带一提:眼镜第一视角还支持 WebRTC 直播到浏览器观看(24fps、2.5Mbps),但那条链路只给人看,不喂模型,两者互不干扰。
动手体验:没有眼镜也能跑通完整管道
📱 不想买眼镜?VisionClaw 内置手机模式,用后置摄像头替代眼镜相机,整条管道(节流、压缩、采样)完全一致:
- 克隆仓库并构建:
git clone https://gitcode.com/gh_mirrors/vi/VisionClaw - 在
Secrets.swift/Secrets.kt填入 Gemini API Key - 点"Start on iPhone / Phone",再点 AI 按钮即可开始语音+视觉对话
🕶️ 如果你已有 Ray-Ban 眼镜,只需在 Meta AI App 里连点"App 版本号"5 次打开开发者模式,再点"Start Streaming"接入眼镜相机。
小结:三层节流,一帧就够
回顾这条管道,VisionClaw 用了三级"闸门"把 24fps 收敛到模型真正需要的画面量:
- 采集层:HEVC 压缩 + 有限帧率档位,先扛住蓝牙瓶颈
- 应用层:节流至 ~1fps + 50% 质量 JPEG,砍掉 95% 以上的传输量
- Agent 层:说话 1fps / 沉默 0.3fps 的动态采样,最后一帧才进模型
对新手来说,这套设计传递的信息很清晰:给 AI"喂图"不是越多越好,而是越准越好。理解了这个思路,你也能给自己的多模态项目设计出既省又聪明的视觉管道。
【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice + vision + agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考