@seclink: 多台 Insta360 / 拇指相机想做多目同步采集,但没有硬件触发线? 我做了个开源工具:用一组动态二维码,把各相机录制的视频离线对齐到同一条 UTC 毫秒时间轴,达到多目相机同步效果。面向具身智能数据采集。 Python 3.11 +…
摘要
一个开源工具,使用动态二维码将多台相机录制的视频离线对齐到同一UTC毫秒时间轴,实现多目相机同步,适用于具身智能数据采集。
查看缓存全文
缓存时间: 2026/08/26 15:47
多台 Insta360 / 拇指相机想做多目同步采集,但没有硬件触发线?
我做了个开源工具:用一组动态二维码,把各相机录制的视频离线对齐到同一条 UTC 毫秒时间轴,达到多目相机同步效果。面向具身智能数据采集。
Python 3.11 + uv,开箱即用。
🔗 https://t.co/KNAcBbH6Go
XiaomingX/multicam-timestamp-align
Source: https://github.com/XiaomingX/multicam-timestamp-align
Multi-Camera Timestamp Alignment (multicam-align)
用一组动态播放的二维码,把多台相机(Insta360、拇指相机等)各自录制的视频,离线对齐到同一条 UTC 毫秒时间轴,达到多目相机同步的效果。面向具身智能多视角数据采集。
原理
单靠“各相机各自录、事后对齐“无法得到毫秒级精度。本工具的做法:
-
在屏幕上以固定频率
freq(如 10 Hz)循环播放一组二维码。 -
每个二维码编码:
NTP1|<T0_ms>|<frame_index>|<seq_len>T0_ms:序列第 0 帧对应的 UTC 毫秒时间戳(整组相同)。frame_index:0,1,2… 递增计数器(定宽 4 位)。
-
所有相机开始录制,把屏幕拍进画面。
-
录完后离线处理:逐帧用
pyzbar识别frame_index,把每一帧映射到绝对时间:t_abs_ms = T0_ms + frame_index / freq * 1000因为
frame_index在相邻屏幕刷新之间递增,相机捕捉到的任意一帧都能内插到亚帧级绝对时刻,补偿了屏幕刷新延迟和相机快门延迟。 -
对每路视频做线性回归
t_abs = a·vf + b(vf= 视频帧时间秒),斜率吸收真实帧率(含 29.97 这类非整数),截距即该相机视频帧 0 的绝对时间。 -
以“序列出现最早“的相机为基准,算出每台相机的
offset,得到统一时间轴。
误差来源与缓解
| 误差来源 | 量级 | 缓解 |
|---|---|---|
| 屏幕刷新延迟 | ~16ms@60Hz | 用 frame_index 内插,不依赖单帧边界 |
| 相机快门/读出延迟 | 数 ms | 线性拟合吸收系统偏差 |
| 帧率非整数(29.97) | 累积漂移 | 用拟合 a·vf+b 而非 frame×1000/fps |
| 各相机时钟漂移 | 50ppm→1h 漂移 180ms | 录制前用 NTP / 手机 App 同步各相机时钟 |
| 二维码漏识别 | 视光照 | 容错 H + 外推 + 覆盖率告警 |
| 序列频率与帧率不匹配 | 一视频帧跨两码 | 序列频率取相机帧率约数(30fps→10Hz) |
关键约束:序列播放频率必须是相机帧率的约数。例如相机 30 fps,序列用 10 Hz(每 3 视频帧一个二维码),确保没有视频帧同时拍到两个相邻二维码而产生歧义。
安装
需要 Python 3.11+ 和 uv。macOS 还需系统库 zbar 与 ffmpeg:
# macOS
brew install zbar ffmpeg
# 或从源码 / 包管理器安装 ffmpeg(Linux: apt install zbar ffmpeg)
# 安装 Python 依赖
uv sync
如果
import pyzbar报Symbol not found,说明系统缺少zbar库,先brew install zbar(macOS)或apt install libzbar0(Linux)。
使用流程
1. 生成二维码序列 + 播放页
uv run multicam-align gen --freq 10 --seq-len 20 --out qr_seq/
- 生成
qr_seq/qr_0000.png…qr_seq/qr_0019.png与全屏播放页qr_seq/play.html。 T0默认取“当前时间 + 3 秒“,留足你打开播放页、启动所有相机的时间。也可用--t0 <UTC_ms>显式指定。
2. 录制
- 全屏打开
play.html(建议关掉系统节能/息屏,浏览器标签保持前台)。 - 所有相机开始录制,确保画面能清晰拍到屏幕上的二维码序列(画面里出现几秒循环即可,不必全程拍)。
- 开始你的采集动作。
- 停止录制,把视频文件拷到本机。
3. 对齐
uv run multicam-align align \
--videos cam1.mp4 cam2.mp4 cam3.mp4 \
--names cam1 cam2 cam3 \
--out aligned/
- 逐帧识别二维码、拟合时间轴,输出
aligned/result.json与各相机 offset / 覆盖率 / RMS。 - 可选
--reference <name>指定基准相机;默认用序列出现最早者。 --step N可只解码每 N 帧以加速(覆盖率统计会变粗)。
4. 重封装视频(起点对齐)
uv run multicam-align remux --result aligned/result.json --out synced/
按各相机 offset 用 ffmpeg -ss 裁剪,使所有输出视频从同一 UTC 时刻开始(synced/<name>_aligned.mp4)。
5. 生成对齐报告
uv run multicam-align report --result aligned/result.json --out report.html
HTML 报告含:各相机 offset / 覆盖率 / RMS / 大段漏识别告警,以及“绝对时间线拟合图“和“残差散点图“,用于判断对齐质量。
6. 提取某一时刻的同步帧
uv run multicam-align extract --result aligned/result.json --at 1703123457000 --out frames/
从每台相机提取最接近目标 UTC 毫秒的那一帧(frames/<name>_<utc>.png),用于拼同步多视角快照。
模块结构
src/multicam_align/
├── cli.py # 统一 CLI(gen/align/remux/report/extract)
├── qr_generator.py # 生成动态二维码序列 + play.html + payload 解析
├── decoder.py # 逐帧识别 frame_index + 线性拟合时间轴
├── align.py # 多相机 offset + 全局时间轴 + result.json
├── remux.py # ffmpeg 按 offset 重封装对齐
├── report.py # matplotlib + HTML 报告
└── extract.py # 给定 UTC 时间提取最近帧
测试
uv run pytest
tests/test_roundtrip.py 验证:生成的每个二维码都能被识别并还原出 (t0, frame_index, seq_len),即对齐方案的核心不变量。
注意事项 / 排错
- 频率约数约束:序列频率务必为相机帧率的约数,否则会出现一帧跨两码的歧义。
- 漏识别告警:若某相机覆盖率过低或存在长段漏识别,报告会标 ⚠,需检查该相机画面中二维码是否清晰、有无运动模糊。
- 超长录制:相机时钟漂移随录制时长累积,长时间采集建议中途再拍一次二维码序列做分段重锚(后续版本可支持多锚点)。
- ffmpeg 精度:
-ss输入级 seek 已足够好;需要逐帧精确重封装时把remux.py改为重新编码(更慢)。
相似文章
@vintcessun: 大规模监控里的中心化融合,当你摄像头到几十上百台,计算瓶颈直接卡死,根本没法扩容,光一个中央站就烧掉大半预算。 这就是为什么不搞分布式的多视角跟踪没法真正落地——中心化方案的扩展成本会随节点数指数飙升,而工程上要的是一次大规模、低成本部署…
MV3DT 是一种全分布式的多视角 3D 跟踪框架,通过点对点协调消除了中心化融合的计算瓶颈,在 100 台摄像头上以 30FPS 运行且通信开销仅 2.2%,零样本校准即可部署,性能达到或超过中心化方法。
OmniDirector: 通用多镜头相机克隆,无需交叉配对数据
一个统一的框架,通过网格运动视频和多模态扩散变换器实现相机运动克隆,无需交叉配对数据即可实现导演级别的控制。
@QingQ77: 通过 AI 引导式对话,将模糊的视频创意逐步拆解为精确到秒的分镜脚本。
video-spec-builder 是一个开源 AI 导引工具,通过问答式对话将模糊的视频创意逐步拆解为精确到秒的分镜脚本,帮助用户理清视频制作思路并输出可执行的拍摄脚本。
@Honcia13: 做短视频二创的人,可以看看这个开源工具: AutoClip。 它是一套 AI 自动切片系统,可以把长视频从下载、分析、剪辑到生成合集,做成一条自动化流水线。 GitHub 目前 3780+ Star。 基本流程是: 输入 YouTube …
AutoClip 是一个开源的 AI 自动切片系统,能够从长视频中自动下载、分析、剪辑并生成合集,支持 YouTube 和 B 站,适合短视频二创场景。
@IndieDevHailey: 全球首个开源 Agentic 视频生产系统!一句话让 AI 帮你拍大片,成本低至几毛钱! 开源开发者 calesthio 打造的 OpenMontage,是全球首个开源 Agentic 视频生产系统,能把 Claude / Cursor …
OpenMontage 是全球首个开源 Agentic 视频生产系统,通过一句话描述自动完成从研究、脚本到配音、合成的全流程,支持 12 大 Pipeline 和 52 个工具,成本低至几毛钱,GitHub 已获超 16k Star。