米家摄像机技术实现全解析
本文从硬件设计、软件架构、云端服务三个层面,系统梳理如何做一个工业级的米家智能摄像机产品。以云台室内机为主线,兼顾枪球一体机(双摄)等形态的差异点。
本文涉及的技术栈在之前的博客中均有专题介绍,可结合阅读:
- 音视频基础与数字化表示 — 采样、编码、色彩空间等基础概念
- P2P 技术介绍 — NAT 穿透、打洞原理
- HLS 与云存储 — 流媒体分片存储与回放
- Matter 协议介绍 — 与米家 IoT SPEC 的对比
一、硬件设计
1.1 系统框图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌─────────────┐
│ 镜头模组 │
│ (Lens+CMOS) │
└──────┬──────┘
│ MIPI CSI
┌─────────┐ I2S ┌──────────┴──────────┐ SDIO/USB ┌──────────┐
│ 麦克风 │───────────►│ │◄───────────────►│ Wi-Fi │
│ (MIC) │ │ 主控 SoC │ │ 模组 │
└─────────┘ │ (SigmaStar/君正) │ └──────────┘
│ │ SPI/eMMC
┌─────────┐ PWM │ CPU + ISP + NPU │◄───────────────►┌──────────┐
│ 喇叭 │◄──────────│ + 视频编码器 │ │ Flash │
│(Speaker) │ DAC │ │ │(NOR/NAND)│
└─────────┘ └──┬───┬───┬───┬──────┘ └──────────┘
│ │ │ │
GPIO │ │ │ │ DDR
┌───────────┘ │ │ └────────┐
│ │ │ │
┌─────┴─────┐ ┌────┴───┴──┐ ┌────┴────┐
│ 红外灯 │ │ 云台电机 │ │ DDR │
│ IR LED │ │ (PTZ) │ │ 内存 │
│ + IR-CUT │ │ 步进/直流 │ │ │
└───────────┘ └───────────┘ └─────────┘
1.2 主控芯片(SoC)
主控是摄像机的核心,需要在一颗芯片上集成 CPU、ISP(图像信号处理器)、视频编码引擎、NPU(AI 推理)等模块。
常见方案:
| 芯片 | 厂商 | CPU | NPU 算力 | 视频能力 | 适用场景 |
|---|---|---|---|---|---|
| SSC337DE | SigmaStar | Cortex-A7 双核 | 0.5~1 TOPS | 3MP@30fps H.265 | 中低端云台机 |
| SSC377 | SigmaStar | Cortex-A7 双核 | ~2 TOPS | 5MP@30fps H.265 | 中高端/双摄 |
| T40XP | 北京君正 | MIPS XBurst2 双核 | 3.2 TOPS | 5MP@30fps H.265/H.264 | 高端/AI 增强型 |
| T31 | 北京君正 | MIPS XBurst 单核 | 有限 | 3MP@25fps | 低成本/低功耗 |
选型要点:
- ISP 质量:直接决定画面效果(降噪、宽动态、3D-DNR)
- 编码器能力:需支持多路同时编码(主码流 + 子码流 + AI 帧)
- NPU 算力:决定能运行多少 AI 模型(人形+人脸需 ≥1 TOPS)
- 内存带宽:视频+AI+ISP 同时工作对带宽要求高
1.3 内存(DDR)
| 类型 | 容量 | 说明 |
|---|---|---|
| DDR2 | 64MB | 低端机型,仅够基础视频 |
| DDR3/DDR3L | 128~256MB | 主流方案,满足视频+AI+P2P |
| LPDDR4 | 256~512MB | 高端双摄或多任务场景 |
内存用途分配(以 128MB 为例):
- Linux 内核 + 用户空间:~30MB
- 视频编码缓冲(主/子码流):~40MB
- ISP 图像 pipeline 缓冲:~20MB
- AI 推理 tensor 缓冲:~20MB
- P2P/网络缓冲:~10MB
- 预留/碎片:~8MB
1.4 存储(Flash)
| 类型 | 容量 | 典型用途 |
|---|---|---|
| SPI NOR Flash | 8~32MB | 存放 bootloader + kernel + rootfs(精简系统) |
| SPI NAND Flash | 128~256MB | 存放完整系统 + 模型文件 + 录像缓存 |
| eMMC | 512MB~8GB | 高端方案,支持本地录像 |
| TF 卡槽 | 用户可插 | 本地录像存储(最大 256GB) |
分区设计(SPI NAND 128MB 典型方案):
1
2
3
4
┌──────────────────────────────────────────────────────┐
│ boot (1MB) │ kernel (4MB) │ rootfs (40MB) │ data (80MB) │
│ U-Boot │ uImage │ squashfs │ jffs2/ubifs │
└──────────────────────────────────────────────────────┘
rootfs:只读的 squashfs,保证系统不会因断电损坏data:可写分区,存放配置文件、AI 模型、日志等- 双分区 A/B 方案用于 OTA 防砖
1.5 CMOS 图像传感器
| 型号 | 厂商 | 分辨率 | 像素尺寸 | 适用场景 |
|---|---|---|---|---|
| SC3336 | 思特威(SmartSens) | 3MP (2304x1296) | 2.5μm | 主流家用 |
| SC5235 | 思特威 | 5MP (2592x1944) | 2.0μm | 高清方案 |
| IMX307 | Sony | 2MP (1920x1080) | 2.9μm | 星光级夜视 |
| OS04A10 | OmniVision | 4MP (2560x1440) | 2.0μm | 中高端 |
选型考量:
- 像素尺寸:越大进光量越多,夜视效果越好
- 灵敏度:决定低照度下的画面噪点
- 快门模式:Rolling shutter(成本低)vs Global shutter(运动无果冻效应)
- 接口:MIPI CSI-2,2-lane 或 4-lane
- 功耗:影响整机热设计
1.6 镜头(Lens)
| 参数 | 典型值 | 说明 |
|---|---|---|
| 焦距 | 3.6mm / 2.8mm | 焦距越短视角越广 |
| 光圈 | F2.0 / F1.6 | 光圈越大进光越多,夜视越好 |
| 视角 | 水平 110°~130° | 家用一般要求 ≥110° |
| IR-CUT | 双滤光片切换 | 白天滤除红外光还原真实色彩,夜间移除滤片增强红外感光 |
| 对焦 | 定焦 | 家用云台机一般为定焦,降低成本 |
镜头座规格:通常采用 M12(S-Mount),通过螺纹调焦后点胶固定。
1.7 Wi-Fi 模组
| 方案 | 频段 | 说明 |
|---|---|---|
| RTL8189FTV | 2.4GHz | 低成本 SDIO 接口,支持 802.11 b/g/n |
| RTL8733BU | 2.4G + 5G + BLE | 双频+蓝牙,USB 接口,支持蓝牙配网 |
| SSW101B | 2.4GHz | SigmaStar 搭配方案,SDIO |
选型要点:
- 吞吐率:1080P@30fps H.265 主码流约 2~4Mbps,需要稳定的 Wi-Fi 带宽
- 抗干扰:家庭 2.4G 频段拥挤,需支持 MIMO 或 5G 频段
- 功耗:影响整机温度
- 蓝牙配网:双模芯片可支持 BLE 配网,体验更好
1.8 云台电机(PTZ)
云台摄像机的机械结构,实现水平旋转(Pan)和垂直俯仰(Tilt):
| 参数 | 水平(Pan) | 垂直(Tilt) |
|---|---|---|
| 电机类型 | 步进电机 | 步进电机 |
| 旋转范围 | 360° | 90°~120° |
| 步距角 | 通常 1/16 微步 | 同左 |
| 减速比 | 齿轮减速 | 齿轮减速 |
| 归位方式 | 光耦/霍尔传感器 | 同左 |
| 驱动芯片 | 如 MS41929 | 同左 |
控制逻辑:
- 上电时通过归位传感器确定零位
- App 发送转动角度命令,转换为步进脉冲数
- 支持预置位、巡航、跟踪等高级功能
- 需做好噪音优化(微步驱动 + 减速比设计)
枪球一体机差异:双摄形态通常一个固定广角镜头 + 一个可变焦 PTZ 镜头,两者协同工作实现”全景追踪+特写跟拍”。
1.9 红外灯与 IR-CUT
1
2
3
4
5
6
7
8
9
10
11
白天模式: 夜间模式:
┌─────────┐ ┌─────────┐
│ 镜头 │ │ 镜头 │
│ ↓ │ │ ↓ │
│ IR-CUT │ ← 滤片挡住IR │ IR-CUT │ ← 滤片移开
│ (挡住) │ │ (移开) │
│ ↓ │ │ ↓ │
│ CMOS │ │ CMOS │ ← 感受 850nm/940nm 红外光
└─────────┘ └─────────┘
↑
IR LED 补光
- 850nm 红外灯:有微弱红光,补光距离远
- 940nm 红外灯:肉眼完全不可见,适合隐蔽场景
- IR-CUT 切换器:由 ISP 根据环境光照度自动控制切换
1.10 麦克风与喇叭
| 组件 | 规格 | 说明 |
|---|---|---|
| 麦克风 | 驻极体/MEMS | 用于拾音、哭声检测、双向对讲 |
| 喇叭 | 8Ω 1W~2W | 用于对讲回放、报警鸣笛 |
| 音频 Codec | 主控内置 / 外挂如 ES8388 | ADC(麦克风→数字)+ DAC(数字→喇叭) |
| 回声消除 | 软件 AEC 算法 | 对讲时消除喇叭声音对麦克风的串扰 |
对讲链路:App 语音 → P2P → 设备解码 → DAC → 喇叭;设备 MIC → ADC → AEC → 编码 → P2P → App
1.11 供电设计
| 方案 | 输入 | 说明 |
|---|---|---|
| DC 5V/2A | Micro-USB / USB-C | 室内云台机标准供电 |
| DC 12V/1A | DC 圆口 | 室外枪机、PoE 供电 |
| 电池供电 | 18650 锂电池组 | 低功耗电池机,PIR 唤醒 |
电源路径:
1
2
USB 5V → DCDC (3.3V/1.8V/1.2V) → SoC / DDR / Wi-Fi / Motor / IR LED
└→ LDO (供模拟电路:CMOS sensor, Audio Codec)
注意事项:
- 电机启动瞬间电流大,需预留余量
- IR LED 大电流 → 独立 MOS 管开关控制
- 数字地和模拟地分开,避免干扰音频和图像
1.12 壳料与结构
| 要素 | 说明 |
|---|---|
| 材质 | ABS / PC+ABS(阻燃等级 V0) |
| 散热 | 主控芯片贴导热硅脂 + 散热片,或壳体本身导热 |
| 防尘 | 镜头面板密封,防止灰尘附着 |
| 防水(室外) | IP65/IP66 等级,O-ring 密封 |
| 天线布局 | Wi-Fi 天线远离电机和金属件,避免遮挡 |
| TF 卡槽 | 隐藏式卡槽 + 弹出机构 |
| 指示灯 | 状态 LED(蓝/橙),可通过命令关闭 |
二、软件架构
2.1 系统整体架构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
┌─────────────────────────────────────────────────────────────┐
│ App 层 / 云端 │
│ 米家 App │ 小米云存储 │ IoT 平台 │
└────────────┬────────┴────────┬────────┴────────┬────────────┘
│ P2P (MISS) │ HTTPS │ MQTT
│ │ │
┌────────────┴─────────────────┴─────────────────┴────────────┐
│ 设备端软件栈 │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌─────────┐ ┌─────────────┐ │
│ │ MISS P2P │ │ 云存储 │ │ IoT │ │ OTA Client │ │
│ │ SDK │ │ 上传模块 │ │ SPEC │ │ │ │
│ └────┬─────┘ └────┬─────┘ └────┬────┘ └──────┬──────┘ │
│ │ │ │ │ │
│ ┌────┴──────────────┴─────────────┴───────────────┴──────┐ │
│ │ 业务逻辑层 (C/C++) │ │
│ │ 音视频采集 │ 编码管理 │ 存储管理 │ AI 调度 │ PTZ 控制 │ │
│ └────────────────────────┬────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┴────────────────────────────────┐ │
│ │ 中间件 / HAL 层 │ │
│ │ ISP 驱动 │ 编码器 API │ Audio API │ GPIO │ Motor │ NPU │ │
│ └────────────────────────┬────────────────────────────────┘ │
│ │ │
├───────────────────────────┴──────────────────────────────────┤
│ Linux Kernel (4.9 / 5.x) │
│ V4L2 │ ALSA │ SPI │ I2C │ SDIO │ USB │ MTD │ NetFilter │
├─────────────────────────────────────────────────────────────┤
│ Bootloader (U-Boot) │
└─────────────────────────────────────────────────────────────┘
2.2 操作系统:Linux + Buildroot
为什么选择 Linux:
- 成熟稳定,驱动丰富
- 社区支持好,芯片厂商提供 BSP(Board Support Package)
- 支持多线程/多进程,适合摄像机复杂业务
- 开源,可定制裁剪
Buildroot 构建系统:
Buildroot 用于构建精简的嵌入式 Linux 根文件系统,相比 Yocto 更轻量,构建速度快。
1
2
3
4
5
6
7
8
9
10
11
# 典型构建流程
$ make <board>_defconfig # 加载板级配置
$ make menuconfig # 配置内核/用户空间包
$ make # 编译生成固件
# 产出物
output/images/
├── u-boot.bin # Bootloader
├── uImage # Linux 内核
├── rootfs.squashfs # 只读根文件系统
└── userdata.ubifs # 可写数据分区
系统裁剪要点:
- 移除不需要的内核模块(USB gadget、蓝牙协议栈等)
- 使用 BusyBox 替代完整 coreutils
- C 库选择 musl libc(比 glibc 小 ~2MB)
- 关闭 kernel printk 减少串口输出开销
2.3 启动流程与快启优化
1
2
3
4
上电 → BootROM → U-Boot → Kernel → Init → 业务进程
│ │ │ │ │
│ (~10ms) │(~500ms) │(~2s) │(~1s) │(~2s)
└───────────────┴──────────┴────────┴───────┴──────── 总计 ~6s 出图
快启优化手段:
- U-Boot: 跳过不必要的设备检测,直接加载内核
- Kernel: 裁剪未用驱动,使用 initramfs 而非 init 脚本
- 用户空间: ISP + 编码器优先启动,延迟加载 AI/P2P 模块
- 目标:从上电到出第一帧画面 ≤3 秒
2.4 烧录工具
固件烧录发生在工厂生产阶段:
| 烧录方式 | 说明 | 适用场景 |
|---|---|---|
| USB 烧录 | PC 通过 USB 连接设备,使用芯片厂商烧录工具 | 工厂量产 |
| SD 卡烧录 | 将固件放入 TF 卡,设备上电自动烧录 | 小批量/研发 |
| UART 烧录 | 通过串口 + TFTP 下载固件 | 调试救砖 |
| 网络烧录 | 通过网络批量下发固件 | 大规模产线 |
量产烧录流程:
1
烧录固件 → 写入设备唯一信息(DID/MAC/Key) → 功能自检 → 贴标入库
每台设备在出厂时会被写入:
- DID(Device ID):米家平台的唯一设备标识
- MAC 地址:Wi-Fi 模组的物理地址
- 设备密钥:用于与米家云端的安全通信
2.5 MIKE:小米 IPC 套件
小米为摄像机生态提供了一整套开发套件 MIKE(Mi IPC Kit Environment),覆盖从底层芯片适配到上层业务 API 的完整链路:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌─────────────────────────────┐
┌───────────────────────────────────────────┐ │ │
│ MIKE 上层 API │ │ │
│ (统一业务接口:音视频、AI、存储、配网等) │ │ │
├───────────────────────────────────────────┤ │ │
│ 中间件模块 │ │ Tools 工具包 │
│ ┌──────┐ ┌────┐ ┌─────┐ ┌────┐ ┌─────┐ │ │ │
│ │ MISS │ │ OT │ │云存储│ │配网 │ │录像 │ │ │ Emulator (设备模拟器) │
│ │(P2P) │ │服务│ │ │ │ │ │ │ │ │ Monitor (运行监控) │
│ └──────┘ └────┘ └─────┘ └────┘ └─────┘ │ │ Auto Test(自动化测试) │
│ ┌─────┐ ┌──────┐ ┌─────┐ ┌───────────┐ │ │ Logger Debugger(日志调试) │
│ │ OTA │ │ 回看 │ │编解码│ │本地AI│NAS │ │ │ │
│ └─────┘ └──────┘ └─────┘ └───────────┘ │ │ 贯穿各层,支持: │
├───────────────────────────────────────────┤ │ - 业务层功能模拟与调试 │
│ 芯片平台适配层 (HAL) │ │ - 中间件模块独立测试 │
│ SigmaStar │ 君正 │ 其他平台 │ │ - 平台适配层验证 │
└───────────────────────────────────────────┘ └─────────────────────────────┘
MIKE 各模块职责:
| 模块 | 说明 |
|---|---|
| MISS(P2P) | 流媒体传输 SDK,负责设备与 App 之间的音视频/命令通道 |
| OT 服务 | 设备联网心跳、在线状态维护 |
| 云存储 | 事件录像切片加密上传 |
| 配网 | Wi-Fi AP 扫码 / BLE 配网流程 |
| 录像 | 本地 TF 卡录像管理(连续/事件录像) |
| OTA | 固件升级(A/B 分区、差分升级) |
| 回看 | 云端/本地录像的时间线回放 |
| 编解码 | 音视频编解码封装(H.265/Opus) |
| 本地 AI | 人形/人脸/宠物/哭声等模型推理调度 |
| NAS 存储 | 局域网 NAS 设备的视频存储(SMB/NFS) |
| 芯片平台适配层 | 屏蔽不同 SoC 的 ISP/编码器/NPU 差异,提供统一 HAL |
| Tools | 贯穿业务层/中间件/平台适配层的开发调试工具集:Emulator(PC 端设备模拟器)、Monitor(运行状态监控)、Auto Test(自动化测试框架)、Logger Debugger(日志抓取与分析) |
MIKE 的设计使得业务开发者无需关心底层芯片差异,通过上层 API 即可完成功能开发;同时 Tools 工具包支持在 PC 上模拟设备运行,大幅提升开发调试效率。
2.6 P2P 模块:MISS SDK
P2P 的基础原理(NAT 类型、UDP 打洞、STUN/TURN)可参考 P2P 技术介绍,此处聚焦小米摄像机的具体实现。
MISS(MIoT Streaming SDK) 是小米封装的 P2P 流媒体传输 SDK,C 语言实现,跨平台(设备端 Linux + App 端 iOS/Android),是 MIKE 套件中的核心通信模块。
架构设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──────────────────────────────────────────┐
│ MISS SDK (上层接口) │
│ 创建通道 │ 发送数据 │ 接收数据 │ 事件回调 │
├──────────────────────────────────────────┤
│ 通道管理 / 调度层 │
│ 连接管理 │ 重连策略 │ 流量控制 │ QoS │
├──────────────────────────────────────────┤
│ P2P 传输层(可插拔) │
│ ┌────────┐ ┌────────┐ ┌────────────┐ │
│ │ TUTK │ │ 尚云 │ │ 小米自研P2P │ │
│ │(Kalay) │ │ │ │ │ │
│ └────────┘ └────────┘ └────────────┘ │
├──────────────────────────────────────────┤
│ 网络层 (UDP/TCP) │
└──────────────────────────────────────────┘
P2P 连接建立流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──────────┐ ┌──────────────┐ ┌──────────┐
│ 摄像机 │ │ P2P 服务器 │ │ App │
└─────┬────┘ └──────┬───────┘ └─────┬────┘
│ 1. 注册上线 │ │
│──────────────────────►│ │
│ │ │
│ │ 2. 查询设备地址 │
│ │◄─────────────────────│
│ │ │
│ │ 3. 返回设备 IP/端口 │
│ │─────────────────────►│
│ │ │
│ 4. NAT 穿透 / P2P 直连 │
│◄════════════════════════════════════════════►│
│ │
│ 5. 若 P2P 失败,走中转服务器 (Relay) │
│◄═══════════[ Relay Server ]═══════════════►│
数据通道类型
MISS SDK 支持多路逻辑通道复用同一条 P2P 连接:
| 通道 | 用途 | 特点 |
|---|---|---|
| 视频通道 | 主/子码流传输 | 高带宽,允许丢帧 |
| 音频通道 | 对讲音频 | 低延迟优先 |
| 命令通道 | 控制指令(PTZ、截图等) | 可靠传输 |
| 文件通道 | 录像回放/下载 | 可靠传输,支持断点续传 |
| 报警通道 | 事件推送 | 低延迟 |
多 P2P 引擎的意义
底层可插拔设计使得:
- TUTK(Kalay):覆盖全球节点,海外连通率高
- 尚云:国内节点部署密集,延迟低
- 小米自研:可控性强,持续优化
- SDK 层自动选择最优引擎,对业务层透明
2.7 配网方式
米家摄像机支持两种配网模式:
Wi-Fi AP 配网(摄像机扫码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌───────────┐ ┌───────────┐
│ 米家 App │ │ 摄像机 │
└─────┬─────┘ └─────┬─────┘
│ │
│ 1. App 生成二维码 │
│ (内含 Wi-Fi SSID + Password + Token) │
│ 显示在手机屏幕上 │
│ │
│ 2. 摄像机上电,│
│ 摄像头对准 │
│ 手机扫描二维码
│ │
│ 3. 摄像机解析二维码, │
│ 获取 Wi-Fi 凭证, │
│ 连接路由器 │
│ │
│ 4. 摄像机连上路由器后, │
│ 通过局域网/云端与 App 握手 │
│◄────────────────────────────────────────►│
│ │
│ 5. 绑定设备到米家账号 │
│─────────────(云端)──────────────────────►│
优势:不需要额外硬件(蓝牙芯片),利用摄像头自身能力完成配网。
BLE + Wi-Fi 双模配网
1
2
3
4
1. App 通过 BLE 发现设备
2. BLE 通道下发 Wi-Fi SSID + Password
3. 设备连接 Wi-Fi
4. 通过云端完成绑定
优势:不依赖摄像头画面,暗光/遮挡场景也能配网。适合支持双模 Wi-Fi+BLE 芯片的方案。
2.8 米家 IoT SPEC 接入
MIoT SPEC 的数据模型(Device → Service → Property/Action/Event)与 Matter 协议的 Cluster 模型在设计哲学上非常接近,两者的详细对比参见 Matter 协议介绍。
摄像机作为一个米家设备,需实现 MIoT SPEC 协议定义的 Service/Property/Action/Event。
摄像机典型 SPEC 定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Device: camera
├── Service: camera-control
│ ├── Property: on (bool) — 摄像头开关
│ ├── Property: night-shot (enum) — 夜视模式 (自动/开/关)
│ ├── Property: watermark (bool) — 水印开关
│ ├── Action: start-recording — 开始录像
│ └── Action: stop-recording — 停止录像
│
├── Service: ptz-control
│ ├── Property: pan-position (int) — 水平角度
│ ├── Property: tilt-position (int) — 垂直角度
│ ├── Action: rotate (direction, speed)— 转动
│ └── Action: go-to-preset (id) — 到预置位
│
├── Service: motion-detection
│ ├── Property: sensitivity (enum) — 灵敏度 (低/中/高)
│ ├── Property: detection-area (struct)— 检测区域
│ └── Event: motion-detected — 移动侦测事件
│
├── Service: ai-detection
│ ├── Property: human-detect-on (bool) — 人形检测开关
│ ├── Property: face-detect-on (bool) — 人脸检测开关
│ ├── Property: pet-detect-on (bool) — 宠物检测开关
│ ├── Property: cry-detect-on (bool) — 哭声检测开关
│ ├── Event: human-detected — 人形检测事件
│ ├── Event: face-detected — 人脸检测事件
│ ├── Event: pet-detected — 宠物检测事件
│ └── Event: cry-detected — 哭声检测事件
│
├── Service: storage
│ ├── Property: sd-card-status (enum) — TF 卡状态
│ ├── Property: cloud-storage-on (bool)— 云存储开关
│ └── Action: format-sd-card — 格式化 TF 卡
│
└── Service: indicator-light
└── Property: on (bool) — 指示灯开关
设备通过 MQTT 协议与小米 IoT 云端保持长连接,上报属性变化和事件。App 下发的控制命令也通过 MQTT → 设备的链路传达。
2.9 云存储
云存储的视频分片与回放机制和 HLS 协议的设计思路类似(将视频切成小片段 + 索引清单),详见 HLS 与流媒体存储。
米家云存储服务负责将摄像机的录像片段上传到云端,用户可在 App 上回看。
上传链路
1
2
3
4
5
6
7
8
9
10
11
12
摄像机端:
ISP → YUV420 → 编码器(H.265, 20fps) → 环形缓冲区 → 事件触发 → 分片(10s/片) → HTTPS 上传
上传流程:
1. 事件触发(移动侦测/AI 检测/用户手动)
2. 从环形缓冲区中切取事件前后的视频片段
3. 对片段加密(AES-128)
4. 通过 HTTPS POST 上传到小米云存储
5. 服务端返回索引信息,设备上报事件元数据
回放流程:
App 请求时间线 → 云端返回视频片段列表 → App 通过 HTTPS 拉流 → 解密播放
关键设计
- 环形缓冲区:内存中保留最近 10~30 秒视频,保证事件触发时能回溯
- 端到端加密:视频在设备端加密,云端不可解密,用户侧密钥解密
- 断点续传:网络波动时自动重传未完成的片段
- 流量控制:根据带宽动态调整上传码率(子码流/主码流)
2.10 AI 算法
算法能力矩阵
| 算法 | 输入 | 推理硬件 | 帧率 | 说明 |
|---|---|---|---|---|
| 人形检测 | 视频帧(子码流 640x360) | NPU | 10~15fps | 判断画面中是否有人 |
| 人脸识别 | 人形区域裁剪图 | NPU | 按需触发 | 陌生人/家人识别 |
| 宠物检测 | 视频帧 | NPU | 10~15fps | 猫/狗检测 |
| 哭声检测 | 音频帧 (16kHz PCM) | CPU/DSP | 实时 | 婴儿哭声识别 |
| 移动侦测 | 帧差法 | CPU | 主码流帧率 | 低计算量的基础检测 |
部署方式
1
2
3
4
5
6
7
8
9
10
11
模型训练 (云端 GPU)
│
▼ 模型量化/转换 (浮点→INT8)
│
▼ 芯片厂商工具链转换 (ONNX → 芯片私有格式)
│ - SigmaStar: IPU Toolkit → .img model
│ - 君正: Magik → .bin model
│
▼ 模型文件打包到固件 data 分区
│
▼ 设备端 NPU Runtime 加载模型推理
AI Pipeline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ISP 输出 YUV 帧
│
├──► 主码流编码 (1080P/1296P) ──► P2P/录像
│
└──► 子码流 (360P/VGA) ──► AI 前处理 (Resize/Norm)
│
▼
NPU 推理 (人形/宠物)
│
▼
后处理 (NMS/阈值过滤)
│
├──► 检测到目标 → 触发事件上报 + 云存储
├──► 人脸区域 → 裁剪 → 人脸识别模型
└──► 无目标 → 等待下一帧
音频 AI(哭声检测) 独立于视频 pipeline,在音频线程中运行:
1
MIC → ADC → 16kHz PCM → 滑窗分帧 → 特征提取(MFCC) → 分类模型 → 哭声/非哭声
2.11 OTA(空中升级)
OTA 是智能设备持续迭代的基础,需保证升级过程的安全性和可靠性。
OTA 流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌───────────┐ ┌──────────────┐ ┌───────────┐
│ 小米 OTA │ │ 摄像机 │ │ 米家 App │
│ 服务器 │ │ │ │ │
└─────┬─────┘ └──────┬───────┘ └─────┬─────┘
│ │ │
│ 1. 检查更新(定时/推送) │
│◄─────────────────────│ │
│ │ │
│ 2. 返回新版本信息 + 下载 URL │
│─────────────────────►│ │
│ │ │
│ 3. 下载固件包 (HTTPS)│ │
│─────────────────────►│ │
│ │ │
│ 4. 校验固件签名 (RSA/ECDSA) │
│ │ │
│ 5. 写入备用分区 (A/B) │
│ │ │
│ 6. 切换启动分区,重启 │
│ │ │
│ 7. 启动成功 → 上报新版本 │
│◄─────────────────────│ │
│ │ │
│ │ 8. App 显示升级完成 │
│ │──────────────────────►│
防砖策略
| 机制 | 说明 |
|---|---|
| A/B 双分区 | 新固件写入备用分区,验证通过后才切换 |
| Watchdog | 启动后若未正常运行,硬件看门狗触发回滚 |
| 启动计数器 | 连续启动失败 N 次自动回退旧分区 |
| 固件签名 | RSA/ECDSA 签名验证,防止篡改 |
| 断电恢复 | 写入过程断电不影响当前运行分区 |
差分升级
为节省带宽和升级时间,支持差分升级(delta OTA):
- 服务端对新旧固件做 bsdiff 生成差分包(通常只有全量包的 10%~30%)
- 设备端收到差分包后,结合当前分区数据 patch 出完整新固件
- 验证 hash 一致后写入
三、音视频链路详解
3.1 视频采集与编码
关于音视频数字化的基础概念(采样、量化、编码、色彩空间)参见 音视频及其数字化表示。
1
2
3
4
5
光线 → 镜头 → CMOS Sensor → ISP → 编码器 → 码流输出
ISP Pipeline:
Raw Bayer → 黑电平校正 → 坏点校正 → Demosaic → 白平衡 →
色彩校正 → Gamma → 降噪(2D/3D-DNR) → 锐化 → YUV 输出
主流小米摄像机使用 YUV420 色彩空间(关于 YUV420 的详细解释参见音视频基础),H.265 视频编码,Opus 音频编码,视频帧率 20fps。
多码流设计:
| 码流 | 分辨率 | 色彩空间 | 帧率 | 编码 | 码率 | 用途 |
|---|---|---|---|---|---|---|
| 主码流 | 1920x1080 / 2304x1296 | YUV420 | 20fps | H.265 | 1~4 Mbps | P2P 高清观看、云存储 |
| 子码流 | 640x360 | YUV420 | 15fps | H.265 | 200~500 Kbps | P2P 流畅观看(弱网)、AI 推理输入 |
| JPEG 流 | 1920x1080 | — | 按需 | JPEG | — | 截图、封面 |
3.2 音频采集与处理
1
MIC → ADC (16kHz/16bit) → AEC(回声消除) → ANR(降噪) → AGC(增益控制) → 编码(Opus)
音频编码采用 Opus,这是一种开源、免版税的编码格式,支持从低码率语音(6kbps)到高码率音乐(510kbps)的全场景覆盖,编码延迟低至 5ms,非常适合实时对讲场景。
- AEC(Acoustic Echo Cancellation):对讲场景必须,消除喇叭回声
- ANR(Automatic Noise Reduction):去除环境底噪
- AGC(Automatic Gain Control):自动调整增益,避免过大过小
3.3 本地存储(TF 卡录像)
1
2
3
4
5
6
7
8
9
10
11
12
13
录像策略:
├── 连续录像: 7x24 循环写入,空间满自动覆盖最旧文件
└── 事件录像: 仅检测到事件时录像,省空间
文件组织:
/mnt/sdcard/record/
├── 2024/11/10/
│ ├── 14/ # 按小时分目录
│ │ ├── 00.mp4 # 每分钟一个文件
│ │ ├── 01.mp4
│ │ └── ...
│ └── 15/
└── index.db # SQLite 索引,加速时间线查询
四、生产与测试
4.1 工厂测试项
| 测试项 | 方法 | 判定标准 |
|---|---|---|
| 视频画面 | 对准标准色卡,自动分析 | 色彩/对比度/清晰度达标 |
| 红外夜视 | 暗箱环境,检查 IR LED 亮度 | 均匀照明,无暗角 |
| 云台运动 | 全范围旋转,检测步数 | 到位精度 ≤1°,无卡顿 |
| 麦克风 | 播放标准音源,检测录入 | SNR ≥ 40dB |
| 喇叭 | 播放测试音频 | 无破音,音量达标 |
| Wi-Fi | 连接指定 AP,测试吞吐 | ≥ 10Mbps |
| TF 卡槽 | 插入测试卡,读写验证 | 速度 ≥ 10MB/s |
| 按键/Reset | 按压检测 | GPIO 电平正确翻转 |
| 功耗 | 各场景电流测量 | 待机 <2W,工作 <5W |
4.2 可靠性测试
| 测试 | 条件 | 要求 |
|---|---|---|
| 高温老化 | 50°C 连续运行 48h | 无死机、画面无异常 |
| 低温启动 | -10°C 冷启动 | 正常出图 |
| 电压波动 | 4.5V ~ 5.5V | 稳定工作 |
| 断电测试 | 随机断电 1000 次 | 系统可正常启动,文件系统无损坏 |
| Wi-Fi 漫游 | 信号衰减/恢复 | 自动重连,P2P 恢复 |
| 长期运行 | 连续运行 30 天 | 无内存泄漏,服务不退出 |
五、总结
一个工业级的米家摄像机产品,从硬件到软件再到云端,涉及的技术栈非常广:
1
2
3
4
硬件: SoC选型 → 传感器 → 光学 → 结构 → 电源 → 射频
软件: OS/BSP → ISP调优 → 编码 → P2P → AI → IoT → OTA
云端: 配网 → 设备管理 → 云存储 → 消息推送 → OTA 分发
生产: 烧录 → 写号 → 自动化测试 → 老化 → 包装
核心挑战在于:在有限的硬件资源(几百 MHz CPU + 百余 MB 内存)下,同时跑通视频采集编码、AI 推理、P2P 传输、云存储上传、IoT 通信等多个实时任务,并保证 7x24 小时稳定运行。这需要精细的资源调度、严格的内存管理和完善的异常恢复机制。
本文将之前博客中分散介绍的技术知识串联到了一个完整的产品场景中:
- 音视频数字化中的采样、YUV420、H.265 编码 → 摄像机的视频采集与编码链路
- P2P 技术中的 NAT 穿透 → MISS SDK 的多引擎 P2P 架构
- HLS 流媒体中的分片存储 → 云存储的切片上传与时间线回放
- Matter 协议中的设备模型 → 米家 IoT SPEC 的 Service/Property/Action 设计
参考资料