前言

买摄像头的时候,很多人以为最大的开销是设备本身。

结果真正用起来才发现:

摄像头只是开始。

云存储才是长期支出。

刚装好的时候,看实时画面没问题。

手机提醒也正常。

可一旦想查看几天前的录像,系统马上提示:

开通云存储会员。

有些按月收费。

有些按年收费。

如果家里摄像头数量比较多,这笔费用甚至比设备本身还贵。

更让不少人介意的是隐私问题。

明明是自己家里的监控画面,却长期存放在第三方服务器上。虽然厂商都会强调安全性,但对于很多用户来说,总还是会有些顾虑。

于是有人开始选择 SD 卡方案。

结果很快又发现新的问题。

容量有限。

循环覆盖。

时间长了容易损坏。

真正需要查找某段录像的时候,经常要来回翻找很久。

我之前也折腾过不少本地化方案。

从厂商原生存储,到各种 RTSP 接入方式,再到后来尝试 Micam 系列方案。功能虽然都能实现,但对于 N1 盒子这类低配置设备来说,多个容器同时运行还是有一定压力。

而最近 Go2RTC 对小米摄像头协议支持完善之后,事情开始变得简单起来。

通过 Go2RTC 负责视频流转换,再结合 EasyNVR 负责录像管理和存储,只需要两个容器就能完成整套本地化监控体系。录像直接保存到 NAS,本地硬盘容量有多大,就能存多久,而且完全不需要继续支付云存储费用。

对于拥有飞牛 NAS、N1 盒子、群晖、极空间或者其他支持 Docker 设备的用户来说,这可能是目前兼顾资源占用、稳定性和使用体验的一种方案。

本文就带大家从零开始完成整个部署过程。

1 什么是Go2RTC?

image-20260205141058304

Go2RTC 是一款功能强大的通用摄像头流媒体服务器,专为解决安防监控领域的视频协议兼容性与低延迟传输难题而设计。它能够作为一个高效的中转网关,将各类传统的监控视频流汇聚并转换为现代化的 Web 友好协议。

作为核心组件,Go2RTC 具备以下关键特性:

  • 多协议互通:原生支持 RTSP、RTMP、HTTP-FLV、WebRTC、MSE、HLS、MJPEG 等几乎所有主流流媒体协议,实现了不同设备与平台间的无缝对接。
  • 极致低延迟:通过 WebRTC 和 MSE 技术,它能将视频传输延迟降低至毫秒级,提供真正实时的监控体验。
  • 轻量级架构:采用 Go 语言开发,编译为独立的二进制文件,零外部依赖。这意味着它不仅部署简便,而且对硬件资源占用极低,非常适合在 NAS、树莓派等边缘设备上长期运行。
  • 灵活扩展:既支持 Docker 容器化部署,也能完美集成到 Home Assistant 等智能家居系统中。

在本方案中,Go2RTC 扮演着“流媒体引擎”的角色:它负责从摄像头拉取原始视音频流,经过实时处理后,不仅能直接通过浏览器流畅播放,还能将标准化的视频流分发给 EasyNVR 进行持久化存储。

2 准备阶段

2.1 部署环境和系统说明

本期教程以用N1刷入arm版的飞牛Nas系统为例,其他Nas系统支持Docker均可(如:绿联Nas、极空间Nas,群晖Nas等)。image-20260205164316465

目前N1的arm版飞牛固件已支持无线网卡驱动,可以通过连接WiFI的方式来进行联网。可以刷入453版固件,然后进行OTA升级至当前最新1.1.18系统版本即可。

2.2 启动Docker服务

在部署之前,首先确保你的Docker为启动状态,在飞牛Nas首页,点击Docker图标,进入应用内启动Docker服务
image-20260205175001098

**PS:**建议存储位置选择挂载的外部存储空间。

2.3 启用SSH服务并连接

进入飞牛Nas的系统设置,来到SSH项,将SSH功能设置为启用
image-20260205175252483

设置好以后,接着电脑上摁Win + X键,选择终端(管理员),打开PowerShell窗口(cmd命令提示符窗口也可以的):

image-20260125220912291

接着,输入如下命令连接你的飞牛NAS(也可以使用其他ssh工具):

# ssh 你的Nas用户名@你的Nas系统IP地址
ssh n1@192.168.50.228

image-20260205175443020

连接成功后,输入如下命令,然后输入密码,切换至root用户:

sudo -i

image-20260125221214085

这样就成功连接上了飞牛Nas的ssh终端啦!

3 Docker部署Go2RTC

在终端,输入如下docker命令,进行一键部署:

mkdir -p $(pwd)/go2rtc/config && touch $(pwd)/go2rtc/config/go2rtc.yaml && docker run -d --name go2rtc --restart always --network host -v $(pwd)/go2rtc/config:/config alexxit/go2rtc

命令会进行创建**/go2rtc/config目录和创建go2rtc.yaml**配置文件,并且执行Docker一键部署命令,如下图:
image-20260206102819687

部署完成后,输入如下命令,查看运行状态:

docker ps

image-20260206102837336

可以看到,status(状态)显示为UP,代表其运行中,接在在浏览器访问你的飞牛Nas的IP地址+1984端口即可访问到web页面:

http://192.168.50.228:1984

image-20260205183207538

可以看到,成功的访问到页面啦!go2rtc就部署好了!

4 配置小米摄像头获取RTSP地址

首先,点击顶部导航栏的add菜单,进入如下页面:
image-20260205202823687

接着,滚动到底部,展开Xiaomi这一栏,填写你的小米账号信息,进行登录,然后点击加载设备:

image-20260205203431999

复制url,然后滚动到顶部,选择顶部导航栏的config菜单,在yaml配置区输入如下配置:

# =================================================================
# GO2RTC 示例配置文件
# -----------------------------------------------------------------
# 【使用说明】
# 1. 访问后台:http://宿主机IP:1984 (默认账号: admin / 密码: password)
# 2. RTSP构造:若取消rtsp段落注释,播放地址如下:
#    - 4K流: rtsp://admin:password@宿主机IP:8554/cam_4k
#    - 标准: rtsp://admin:password@宿主机IP:8554/cam_std
# 3. 参数说明:
#    - subtype=3: 锁定 4K 极清分辨率
#    - subtype=2: 锁定 1080P/2K 高清分辨率
#    - #audio=pcmu: 强制音频解码,解决部分设备无声问题
# =================================================================

api:
  listen: ":1984"
  username: admin
  password: "password"

# rtsp:
#   listen: ":8554"
#   username: admin
#   password: "password"

streams:
  xiaomi:
    - "you_xiaomi_url&subtype=2#video=copy#audio=pcmu"
  xiaomi_4k:
    - "you_xiaomi_url&subtype=3#video=copy#audio=pcmu"

xiaomi:
  "USER_ID": V1:EXAMPLE_TOKEN

即如下图所示:
image-20260206115102027

设置完成后,点击Save & Restart按钮,进行保存并且重启,接着回到首页,点击stream进去,验证是否能播放:

image-20260206115623864

如下能够出现画面即代表配置成功啦:
image-20260206115754458

由于前面配置中开启了rtsp的用户名和密码功能,以xiaomi_4k这个流为例,所以rtsp的流地址应为:

# 无密码的构建方式
rtsp://宿主机IP:8554/xiaomi_4k

# 开启密码认证的构建方式
rtsp://admin:123456@宿主机IP:8554/xiaomi_4k

PotPlayer播放器中进行演示,按ctrl + u快速打开播放网络地址窗口,输入rtsp的流进行测试:
image-20260206120144526

播放成功,这样我们就完成了Go2RTC的部署和测试,摄像头视频流已经成功转换为标准RTSP协议。

5 Docker部署EasyNVR

现在我们已经有了标准的RTSP视频流,接下来就需要将这些流接入EasyNVR进行录像存储和管理。EasyNVR作为专业的NVR系统,能够提供录像、回放、告警等完整的监控功能。

5.1 EasyNVR介绍

image-20251218105203364

EasyNVR 是一款专业的软件型网络录像机(Network Video Recorder,NVR),用于集中管理和录像多路网络摄像头的视频流。它可以替代摄像头厂商提供的云存储服务,将录像统一存储在本地 NAS 或服务器上,实现完全的本地化管理。

EasyNVR 的核心功能包括:多摄像头接入,支持 RTSP、RTMP、ONVIF 等标准协议,并能够接入不同品牌和型号的摄像头,实现统一管理;本地录像存储,视频数据直接写入 NAS 或本地服务器,不依赖厂商云服务,从而避免长期订阅费用,同时支持长期录像和循环覆盖策略;实时监控与历史回放,通过 Web 界面集中管理所有摄像头,可以查看实时画面、快速定位历史录像,并支持多路同步播放和时间轴浏览;稳定运行,可在 NAS、迷你主机或家用服务器上 7×24 稳定运行,Docker 部署支持跨平台、快速安装和升级。

5.2 Docker一键部署EasyNVR

回到N1的终端窗口,输入如下命令,查看磁盘占用及情况:

df -h

image-20260206141036361

可以看到,外置存储大小一共239G,挂载的根路径为vol1,所以我们需要将录像存储路径改为该位置,首先在该位置单独创建一个文件夹:

mkdir -p /vol1/EasyNVR
cd /vol1/EasyNVR

然后进行一键部署EasyNVR(注意替换存储路径):

docker run -d --name easynvr --restart always --network host --log-opt max-size=50M -v "$PWD/configs:/app/configs" -v "$PWD/logs:/app/logs" -v "$PWD/temporary:/app/temporary" -v /vol1/EasyNVR:/app/r -v "$PWD/stream:/app/stream" registry.cn-shanghai.aliyuncs.com/rustc/easynvr_arm64:latest

如下图所示:
image-20260206141955141

接着,在浏览器中访问你的飞牛Nas主机ip地址+10000端口,即可访问到EasyNVR页面了:
image-20260206142106956

5.3 初始化登录EasyNVR

访问到EasyNVR页面后,直接点击页面的登录按钮即可进入首页,然后语言设置直接选择简体,确定即可:

image-20260206142257126

属性配置为你的局域网地址,一般自动获取正确,不用修改,直接点击确定即可:
image-20260206142355746

开放端口页面,默认无需操作,直接下一步即可:
image-20260206142437400

在重置账号页面,创建一个新的管理员账户,点击确定:
image-20260206142518902

这样就完成初始化操作啦,使用新的账号进行登录,即可进入EasyNVR首页:
image-20260206142557193

6 将RTSP流接入EasyNVR

前面已经介绍了EasyNVR支持接入 RTSP、RTMP、ONVIF 等标准协议,并能够接入不同品牌和型号的摄像头,实现统一管理。简单说一下区别:RTSP 是纯视频流协议,只能拉流观看,不支持云台控制;RTMP 主要用于推流场景,同样不支持设备控制;而 ONVIF 是一套完整的设备管理标准,除了拉流外还支持云台控制、设备发现、参数配置等功能,如果你的摄像头支持 ONVIF,优先推荐使用它接入。

首先打开EasyNVR的首页,然后选择设备列表菜单,点击添加按钮:

image-20260206142653155

这里由于是RTSP协议地址,所以选择PULL,下面也可以看到提示为接入设备RTSP、HTTP、TCP实时流,然后填写好拉流地址,点击确定:

image-20260206143304451

点击确定后,就可以看到你的设备添加上来了,可以看到在线状态:

image-20260206143347684

点击播放图标,点击进入,然后可以看到录像计划显示为未录像,这里直接将其设置为,这样就会一直录制啦:

image-20260206143457300

点击下方的直播中按钮,即可进入到观看页面:

image-20260206143541108

如下图所示:

image-20260206143611215

可以看到,该直播预览页面集成了多协议实时播放、线路切换、云台控制与参数可视化等能力,用户可根据实际场景在 WebRTC、HTTP-FLV、RTMP、RTSP 等协议间自由切换以兼顾延迟与兼容性;在视频播放的同时,页面还实时展示分辨率、编码格式、传输方式、码率等关键流媒体信息,便于调试与排障;若视频流协议源本身支持云台控制,还可直接在页面中完成方向控制、变倍与速度调节,实现从预览到运维的一体化操作。

7 查看录像回放

前面设置好了录像计划,设置的为每天,设置好后就会即刻开始录像。我们回到首页,选择菜单的录像回放

image-20260206144244936

我们直接点击查看图标,即可进来回放页面了:

image-20260206144443435

不仅回放功能,还支持选择指定时间段进行下载:

image-20260206144806195

好啦,基本设置就完成啦,EasyNVR还拥有更多功能值得你去探索!

8 穿透EasyNVR实现公网访问

到这里,EasyNVR 已经在飞牛 NAS 上跑起来了,录像也都存在本地硬盘上,彻底告别了云存储月租费。但问题来了:虽然各家摄像头 APP 也能看实时画面,但想回看历史录像就要交钱,而且家里几个不同品牌的摄像头还得装好几个 APP,管理起来很麻烦。

有了 cpolar 内网穿透,这些问题就迎刃而解了。只需简单配置,就能让 EasyNVR 通过公网地址随时随地访问——不仅能看实时画面,更重要的是免费回放本地存储的所有录像。而且一个链接就能分享给家人,不用每个人都装 APP、注册账号,浏览器打开就能看

8.1 什么是cpolar?

image-20250910114418412

  • cpolar 是一款内网穿透工具,可以将你在局域网内运行的服务(如本地 Web 服务器、SSH、远程桌面等)通过一条安全加密的中间隧道映射至公网,让外部设备无需配置路由器即可访问。
  • 广泛支持 Windows、macOS、Linux、树莓派、群晖 NAS 等平台,并提供一键安装脚本方便部署。

8.2 安装cpolar

在前面连接的飞牛终端中输入如下命令,一键安装cpolar:

sudo curl https://get.cpolar.sh | sh

image-20260127145907036

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

sudo systemctl status cpolar

image-20260127145921847

8.3 注册及登录cpolar web ui管理界面

访问cpolar官网,点击免费注册按钮,进行账号注册

image-20250804085039567

进入到如下的注册页面进行账号注册:
image-20250804085208319

注册完成后,在浏览器中输入飞牛NAS的IP地址+9200端口访问 web ui管理界面:

http://192.168.50.228:9200/

image-20251014164829371

输入刚才注册好的cpolar账号登录即可进入后台页面:

image-20260127145959685

8.4 穿透EasyNVR的WebUI界面

点击左侧菜单栏的隧道管理,展开进入隧道列表页面,页面下默认会有 2 个隧道:

  • ssh隧道,指向22端口,tcp协议
  • website隧道,指向8080端口,http协议(http协议默认会生成2个公网地址,一个是http,另一个https,免去配置ssl证书的繁琐步骤)

image-20260127150100401

点击编辑website的隧道,这里设置名称为easynvr方便辨识,然后本地地址填写10000端口系统的访问地址,地区这里选择的China Top,然后点击更新:

image-20260127150145380

接着,点击左侧菜单的状态菜单,接着点击在线隧道列表菜单按钮,可以看到有2个easynvr的隧道,一个为http协议,另一个为https协议:

image-20260127150238476

接下来在浏览器中访问easynvr隧道生成的公网地址,这里以https为例:

image-20260127150341892

可以看到成功的访问到EasyNVR的页面啦!不过随机域名方式适合预算有限的用户。使用此方式时,系统会每隔 24 小时 左右自动更换一次域名地址。对于长期访问的不太友好,但是该方案是免费的,如果您有一定的预算,可以查看固定域名方式,且访问更稳定哦。

9 固定二级子域名

随机域名虽然免费,但每 24 小时左右会自动更换一次,每次变化都要重新记地址、重新分享链接,用起来确实不太方便。如果你希望拥有一个固定不变、简短易记的专属域名,只需升级 cpolar 任意付费套餐,即可配置固定二级子域名,彻底告别域名频繁变化的烦恼。下面我们来看看如何操作。

首先,进入官网的预留页面:

https://dashboard.cpolar.com/reserved

然后,选择预留菜单,即可看到保留二级子域名项,填写其中的地区、名称、描述(可不填)项,然后点击保留按钮,操作步骤图如下:

image-20251218171936173

列表中显示了一条已保留的二级子域名记录:

  • 地区:显示为China Top
  • 二级域名:显示为easynvr

注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主

接着,进入侧边菜单栏的隧道管理下的隧道列表,可以看到名为easynvr的隧道:

image-20260206145416681

点击编辑按钮进入编辑页面,修改域名类型为二级子域名,然后填写前面配置好的子域名,点击更新按钮:

image-20260127150543409

接着来到状态菜单下的在线隧道列表可以看到隧道名称为easynvr的公网地址已经变更为二级子域名+固定域名主体及后缀的形式了:

image-20260127150619281

这里以https访问测试一下:

image-20260127150808999

访问成功,让我们再进行登录测试一下:
image-20260127151008969

成功登录!以后你不管是去公司上班,还是外出旅游,都可以通过这个固定的公网地址,随时随地打开 EasyNVR,不仅能实时查看家里的情况,还能随意回放之前的录像。而且,这个地址是永久固定的,不用再担心过段时间就变了,是不是超级方便!

总结

体验下来,这套方案最大的变化并不是画质提升了多少,而是彻底改变了摄像头的使用方式。

以前录像属于平台。

回放需要会员。

容量受限于云服务套餐。

而现在,所有录像都直接存储在自己的 NAS 上,保存多久、如何管理、谁能访问,全部由自己决定。

相比之前依赖 Micam 多组件协作的方案,Go2RTC 加 EasyNVR 的组合明显更加轻量。对于 N1 盒子、低功耗 NAS 甚至部分迷你主机来说,两容器架构也更适合长期运行。

更重要的是,通过 cpolar 打通公网访问之后,监控系统不再局限于家庭网络。无论是在公司上班、出差还是外出旅游,都能够通过浏览器直接访问 EasyNVR,查看实时画面和历史录像。

如果你家里也装着小米摄像头,并且已经开始厌倦持续不断的云存储续费,那么这套方案确实值得尝试。毕竟监控数据本来就是自己的,能够掌握在自己手里,往往才是最安心的存储方式。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐