家里有好几个摄像头多台小米一些自己用 ESP32 搭的还有几台树莓派 CSI 摄像头。之前一直在用一些云存储方案但总觉得不放心厂商绑定、依赖网络、费用还不少。索性自己动手写了个 NVR 系统就叫 MiBeeNvr。为什么做 MiBeeNvr说实话我对现有的云存储方案一直不太满意。先说小米摄像头吧默认只能通过米家 app 查看录像存储要么靠 SD 卡容量有限还得经常插拔要么就得上云。云存储每个月几十块而且最关键的是隐私问题——你不知道厂商什么时候会把你的视频数据拿去训练 AI或者干脆就把数据卖给了第三方。更别提厂商绑定了想换平台都难。ESP32 摄像头也是类似的情况。自己用 ESP32 搭了几个摄像头录像是存 SD 卡但查看和回放都不方便。需要一个统一的管理平台。市面上其他开源方案我也试过ZoneMinder 需要 LAMP 堆栈安装部署比我整个项目还复杂Shinobi 配置复杂得一塌糊涂还有些小众项目基本上都没维护了。Frigate 虽然不错但主要是针对 AI 检测而且依赖 Docker太重了。说白了就是想要一个单文件二进制下载就能跑资源占用要少树莓派都能跑支持多种摄像头特别是小米私有协议Web 界面要清爽不用折腾前端自动清理旧录像不会占满硬盘折腾了一圈发现现成方案都不太合适那就自己写一个吧。MiBeeNvr 是什么MiBeeNvr 是一个用 Go 写的轻量级 NVR 系统专门解决家用摄像头的本地存储问题。整体架构先看一张全局架构图整个系统长这样三层结构摄像头端负责采集中间有协议桥接层处理私有协议MiBeeNvr 核心做录制和存储上面再挂各种访问方式。录制流水线视频流进入 MiBeeNvr 之后的处理流程说白了就是RTSP → RTP 解包 → MP4 封装 → 分段存储。前端用的是 Svelte 5整个 SPA 直接编译成静态资源然后 embed 到 Go 二进制里这样部署时只需要一个文件连 Web 服务器都省了。后端技术栈Go 1.26 modernc.org/sqlite纯 Go 实现无 CGO 依赖chi 路由库简洁高效gortsplib 处理 RTSP/RTP 协议pion/rtp 处理实时流媒体选 SQLite 是因为它单文件、纯 Go 实现、性能对家用场景完全够用、支持并发访问最重要的是不需要额外装数据库。设计理念整个项目的设计哲学就是「简单粗暴」单个二进制文件无任何外部依赖支持交叉编译AMD64/ARM64 都能跑配置文件用 YAML简单直观内置 Web 界面打开浏览器就能用资源占用极少树莓派 3b 也能流畅运行主要特性支持多种摄像头协议RTSPH.264/H.265、HTTP JPEG内置 Web 界面支持明暗主题切换中文/英文双语支持WebDAV可读写、FTP、REST APIMQTT 触发录制适合智能家居集成Prometheus 监控指标每个摄像头独立的保留策略MP4 分段录制自动清理旧文件支持 HLS 直播流最多 4 个并发我的实际部署我这边是用一台 树莓派3b 跑的1GB 内存挂载了 3TB 存储。整个系统跑得很稳定基本上是设置完就不管了。接了 4 个摄像头各有特点树莓派 CSI 摄像头 - 通过 MediaMTX 做 RTSP 桥接把 CSI 接口的视频流转换成标准 RTSP。配置rtsp_h264。ESP32-S3 摄像头 - 自己搭的跑 MJPEG 流通过 HTTP 协议接入。配置http_jpeg。小米摄像头- 通过 go2rtc 把小米私有协议转成 RTSP2K 分辨率配置rtsp_h265。配置是 30 秒分段录制保留 1 天。这个时间间隔是个权衡太短了文件太多太长了万一出事查起来不方便。开了 WebDAV可读写和 FTP方便手机查看和备份。Web 界面挺清爽的摄像头管理、录像列表都有。设置页面配置文件完整的配置文件长这样YAML 格式一目了然server:listen: :9090storage:root_dir: /data/nvrsegment_duration: 30scameras:- id: rpi-csi-camname: RPi CSI Cameraprotocol: rtsp_h264url: rtsp://10.0.1.100:8554/streamenabled: true- id: esp32-camname: ESP32-S3 Cameraprotocol: http_jpegurl: http://10.0.1.101/captureenabled: true- id: xiaomi-balconyname: Xiaomi Cameraprotocol: rtsp_h265url: rtsp://10.0.1.102:8554/xiaomi_streamenabled: truecleanup:retention_days: 30disk_threshold_percent: 95auth:username: adminpassword_hash: 用 mibee-nvr hash-password 命令生成webdav:enabled: truepath_prefix: /davread_write: trueftp:enabled: trueport: 2121小米摄像头接入小米摄像头的协议问题是个大坑。它用自己私有的 “miss”Mi Secure Streaming协议做了多层加密不开放标准 RTSP 接口。也就是说你就算知道摄像头的 IP也没法用 VLC 直接拉流。不过好在有 go2rtc 这个神器。整个接入链路是这样的整个过程不需要刷机、不需要拆摄像头、也不需要小米官方的云存储。go2rtc 帮你搞定了所有协议转换的事情。go2rtc 部署go2rtc 用 Docker 部署最省事# 创建配置文件cat go2rtc.yaml EOFstreams:xiaomi_balcony:- xiaomi://your_account:cn10.0.1.100?didyour_camera_didmodelisa.camera.hlc7xiaomi_living_room:- xiaomi://your_account:cn10.0.1.101?didyour_camera_didmodelisa.camera.mj200rtsp:listen: :8554EOF# 运行容器docker run -d --name go2rtc \-p 8554:8554 \-p 1984:1984 \-v $(pwd)/go2rtc.yaml:/config.yaml \alexxit/go2rtc关键点xiaomi:// 协议需要小米账号和密码认证did 是设备的唯一标识model是设备型号在米家 app 里能找到go2rtc 会自动处理 P2P 连接和 miss 协议解密最终在 8554 端口暴露标准的 RTSP 流MiBeeNvr 当普通摄像头接入就行然后在 MiBeeNvr 的配置里指向 go2rtccameras:- id: xiaomi-balconyname: 小米摄像头protocol: rtsp_h265url: rtsp://localhost:8554/xiaomi_balconyenabled: true踩坑记录小米摄像头的接入有不少坑首次联网小米摄像头必须能连外网因为需要和小米服务器做密钥交换。建立连接后后续传输是局域网内的。设备 ID 获取每个摄像头的 did 都不同需要用 go2rtc 的 WebUI端口 1984自动发现或者在米家 app 里翻。不是所有型号都支持go2rtc 维护了一个兼容列表买摄像头之前最好先查一下。H.265 vs H.264新款小米摄像头基本都是 H.265MiBeeNvr 对两种编码都支持但 H.265 省存储空间。ESP32 摄像头项目搞 MiBeeNvr 的时候顺带做了几款 ESP32 摄像头固件。ESP32 摄像头这个坑踩了不少但也挺有意思的。三款固件定位不同所有固件都设计成 MiBeeNvr 的上游采集端摄像头负责采集视频MiBeeNvr 负责统一存储和管理。MiBeeCam — ESP32-S3-A10 方案ESP32-S3-A10 开发板 OV2640 摄像头8225N 模块16MB FlashESP-IDF v5.4.3 开发。功能上 MJPEG 流、帧差法移动检测、Web 配置界面、Prometheus 指标都有。说实话有块 LCD 屏幕调试方便很多。AI_Thinker ESP32-CAM — 经典方案入门级选择AI_Thinker ESP32-CAM 开发板到处都能买到十几块钱一块。4MB Flash 4MB PSRAM跑 MJPEG 流没问题。亮点是支持 SD 卡存储和 NAS 上传WebDAV/HTTP还做了自适应暗场景检测——晚上会自动切换红外模式。缺点是没有屏幕调试不方便Flash 只有 4MB。MiBeeHomeCam — XIAO ESP32-S3 SenseXIAO ESP32-S3 Sense 板子小巧精致带 OV2640/OV3660 双摄像头支持8MB Octal PSRAM 充分利用。亮点是 AVI 分段录制不是简单的截图是真的视频录制、FTP/WebDAV 双协议上传、看门狗防死机、芯片温度监控、批量文件管理。适合长期稳定运行的场景。系统服务配置为了稳定运行用 systemd 管理 MiBeeNvr[Unit]DescriptionMiBee NVRAfternetwork-online.targetWantsnetwork-online.target[Service]TypesimpleUsernvrExecStart/mnt/data/nvr/bin/mibee-nvr -config /mnt/data/nvr/mibee-nvr.yamlWorkingDirectory/mnt/data/nvrRestarton-failureRestartSec5# 安全加固NoNewPrivilegestrueProtectSystemstrictReadWritePaths/mnt/data/nvrPrivateTmptrue[Install]WantedBymulti-user.target保存到/etc/systemd/system/mibee-nvr.service然后systemctl enable --now mibee-nvr就完事了。自动开机启动挂了也会自动重启。开源地址MiBeeNvr 已经开源欢迎 star 和贡献MiBeeNvrhttps://github.com/Mi-Bee-Studio/MiBeeNvr MIT 许可证MiBeeCamhttps://github.com/Mi-Bee-Studio/luatos-esp32s3-a10-camera MITAI_Thinker ESP32-CAMhttps://github.com/Mi-Bee-Studio/ai-thinker-esp32-cam MITMiBeeHomeCamhttps://github.com/Mi-Bee-Studio/seeed-esp32s3-cam GPL v3.0文档比较全部署和配置都有详细说明。写在最后说实话折腾这个项目主要是因为对现有方案都不满意。云存储太贵开源方案太重商业产品又太封闭。自己写一个刚好轻量、免费、可控。对了项目取名 MiBeeNvr“Mi” 代表我Mickey“Bee” 代表?保密“Nvr” 自然是网络录像机了。简洁好记又有点意思。