摄像头回放不想一直依赖云存储?用 EasyNVR 把录像留在飞牛 NAS
前言
家里的摄像头平时可能一天都不会点开几次,可真遇到需要回看录像的时候,存储这件事就一下变得重要了。内存卡容量有限,录像会循环覆盖;不同品牌又各有自己的 App,历史回放往往还和云存储套餐绑在一起。我更希望把"看监控"和"录像保存"拆开:摄像头继续负责采集画面,录像统一落到自己手里的 NAS,需要回放时从自己的存储里找,而不是先想还有没有云端记录。
这次我用飞牛 NAS 部署 EasyNVR,实际接入一台乔安摄像头。先通过 SSH 和 Docker 把 EasyNVR 跑起来,再把录像目录映射到 /vol1/1000/Photos/EasyNVR;随后给摄像头做 IP-MAC 绑定,拿到 RTSP 地址,用 PotPlayer 先验证视频流,再接入 EasyNVR,设置录像计划并检查直播、历史回放和时间段下载。最后再用 cpolar 把 EasyNVR 的 10000 Web 页面提供到公网,并切换到固定二级子域名 easynvr。我这次更看重的是"录像有没有真的留下来":页面能打开只是第一步,流地址对不对、录像计划有没有生效、回放能不能找到、文件有没有进 NAS,这些都要一层一层验证。这样以后真遇到画面断了、录像没生成或外网打不开时,也知道应该从哪一层开始查。

1. EasyNVR 在这套方案里负责什么?

EasyNVR 是一款软件型网络录像机,也就是 NVR。放到家庭 NAS 场景里,它的作用是把多个网络摄像头的视频流集中接进来,再统一做实时预览、录像和回放。
当前介绍中提到它支持:
- RTSP
- RTMP
- ONVIF
- 多摄像头接入
- 本地录像存储
- 实时监控
- 历史回放
- 多路同步播放和时间轴浏览
这里我更关心的是这次实际跑通的链路:摄像头视频流能不能先验证、能不能接入 EasyNVR、录像能不能真正留下来、回放能不能打开。
项目功能介绍里还强调多品牌统一管理、长期本地存储和 7×24 运行等能力,但真正部署时,存多久、接多少路以及运行稳定性,最终还是要结合自己的 NAS、硬盘空间和摄像头环境来判断。
2. 在飞牛 NAS 上部署 EasyNVR
这次是在 Windows 虚拟机中的飞牛 NAS 上操作,其他 NAS 的具体入口可能不同,但这里保留当前飞牛操作流程。
先确保飞牛已经开启 SSH。

在 Windows 中按 Win+R,输入 cmd 打开命令提示符,然后连接飞牛:
shell
ssh 飞牛用户名@你的Nas系统IP地址

登录以后切换到 root:
shell
sudo -i
输入飞牛用户名对应的密码。

3. 先用 Docker 把 EasyNVR 跑起来
执行当前部署命令:
shell
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 "$PWD/r:/app/r" -v "$PWD/stream:/app/stream" registry.cn-shanghai.aliyuncs.com/rustc/easynvr_amd64:latest
如果终端返回容器 ID,说明容器已经在后台启动。

这条命令使用了:
- 容器名:
easynvr --restart always--network host- 日志限制:
max-size=50M - configs、logs、temporary、r、stream 多个目录挂载
- 镜像:
registry.cn-shanghai.aliyuncs.com/rustc/easynvr_amd64:latest
先让服务跑起来,后面再处理录像目录。
4. 录像如果想直接出现在飞牛相册里,可以单独映射目录
如果希望 EasyNVR 的录像直接写进飞牛相册目录,可以把录像路径单独映射过去。

当前示例里的飞牛相册路径是:
shell
/vol1/1000/Photos
在下面单独创建 EasyNVR 目录:
shell
mkdir -p /vol1/1000/Photos/EasyNVR
然后使用这条完整命令部署:
shell
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/1000/Photos/EasyNVR:/app/r -v "$PWD/stream:/app/stream" registry.cn-shanghai.aliyuncs.com/rustc/easynvr_amd64:latest
这样 /app/r 就映射到了:
/vol1/1000/Photos/EasyNVR
后面生成的录像文件就会进入这个目录,和其他照片分开保存。
5. 确认 EasyNVR 容器和 Web 页面
执行:
shell
docker ps

当前状态显示为 UP。
接着通过浏览器访问:
shell
http://你的飞牛NAS系统IP地址:10000

页面打开后,按当前流程使用 admin 登录。

进入首页以后先选择简体语言。

继续下一步。

最后设置新的账号名称和密码,完成初始化。

到这里,EasyNVR 本身已经能进入管理后台,但真正的核心还在后面:把家里的摄像头流接进来。
6. 摄像头接入前,先把 IP 固定下来
摄像头如果通过 DHCP 自动获取地址,重启或网络变化后 IP 可能改变。对于依赖固定流地址的接入方式,这会直接影响 EasyNVR 后续能不能继续找到摄像头。
当前给出的两种方式是:
- 摄像头自身设置静态 IP;
- 在路由器里做 DHCP 静态绑定 / IP-MAC 绑定。
这次使用的是乔安摄像头,它不能直接把自己设置成静态 IP,所以在路由器后台找到摄像头并做 IP-MAC 绑定。

不同路由器的页面会不同,但目标是一致的:后面接入 EasyNVR 时,摄像头地址不要随意变化。
7. 先拿到 RTSP 地址,再用播放器验证
这台摄像头当前 IP 是:
shell
192.168.50.127
直接在浏览器里访问这个地址,登录摄像头后台,可以看到 RTSP 开关和认证设置。

当前 RTSP 地址示例为:
shell
# rtsp://用户名:密码@摄像机IP地址/live/ch00_0
rtsp://admin:admin123@192.168.50.127/live/ch00_0
这里的用户名、密码、IP 和路径都属于当前示例,真正使用时应以自己的摄像头提供的信息为准。
我不建议拿到地址后立刻就往 EasyNVR 里填。先用支持网络流播放的程序验证一次,会更省事。
这里使用 PotPlayer 测试。

能够看到实时画面以后,至少可以确认:
摄像头 → RTSP 地址 → 播放器
这条最基础的视频流链路是通的。
8. 把 RTSP 视频流接入 EasyNVR
回到 EasyNVR,进入【设备列表】,点击【添加】。

因为当前使用的是 RTSP 拉流地址,这里选择:
PULL
页面提示也对应 RTSP、HTTP、TCP 实时流。
填入拉流地址后确认。

设备添加以后,可以看到在线状态。

这一步说明 EasyNVR 已经能够识别并连接当前视频流。
9. 给通道设置录像计划
进入通道列表。
当前录像计划显示为"未录像",继续把它设置为每天录像。

完成以后,EasyNVR 会开始按当前计划录制。
这时如果前面已经把 /app/r 映射到飞牛相册目录,录像保存位置也就跟着确定下来。
10. 实时画面也要实际看一次
点击"直播中"进入观看页面。

当前实时画面能够正常显示。

这个页面还展示了 WebRTC、HTTP-FLV、RTMP、RTSP 等播放方式,以及分辨率、编码格式、传输方式、码率等流媒体信息。
当前介绍还提到,如果视频流协议源本身支持云台控制,可以在页面中完成方向控制、变倍和速度调节。
这次真正已经验证的是当前 RTSP 源能够成功进入 EasyNVR 并显示直播画面。其他协议和云台能力是否可用,则继续取决于实际设备和接入方式。
11. 再检查历史录像和下载
录像计划设置好以后,进入【录像回放】。

打开查看页面。

这里可以按时间查看录像。
同时还支持选择指定时间段进行下载。

如果前面采用了飞牛相册路径映射,也可以在飞牛相册里看到对应录像文件。

到这里,这次真正需要的家庭录像闭环已经跑起来了:
摄像头固定地址 → RTSP 验证 → EasyNVR 接入 → 每天录像 → 历史回放 → 时间段下载 → NAS 本地目录。
12. 本地录像已经跑通,再处理外网访问
如果只在家里使用,EasyNVR 到这里已经可以承担本地预览和回放入口。
如果人在外面还想打开 EasyNVR Web 页面,再增加公网入口。
这里 cpolar 的职责很明确:
只把 EasyNVR 的
10000Web 页面映射到公网。
摄像头采集、RTSP 拉流、录像写盘和历史回放仍然由 EasyNVR 和 NAS 完成。

13. 在飞牛安装 cpolar
执行安装命令:
shell
sudo curl https://get.cpolar.sh | sh

然后检查服务:
shell
sudo systemctl status cpolar

服务正常以后,先注册 cpolar 账号。

进入注册页面。

随后通过飞牛 NAS 的 IP + 9200 打开 Web UI。
当前示例地址为:
shell
http://192.168.184.137:9200/

登录以后进入后台。

14. 先用随机公网地址验证 EasyNVR
当前 cpolar 页面里默认有两条隧道:
ssh→22/ TCPwebsite→8080/ HTTP

编辑 website 隧道,把它改成 EasyNVR 的 Web 服务。
当前配置为:
- 隧道名称:
easynvr - 本地地址:
10000 - 地区:
China Top

更新后,在线隧道列表会看到两个 easynvr 地址:
- HTTP
- HTTPS

用 HTTPS 地址访问。

EasyNVR 页面可以正常打开。
这一步确认的是:
EasyNVR 10000 → cpolar 公网地址 → 外部浏览器访问成功。
当前说明中记录随机域名大约每 24 小时会变化一次,因此更适合先做连接验证。
15. 长期使用再换固定二级子域名
进入预留页面:
shell
https://dashboard.cpolar.com/reserved
在"保留二级子域名"中填写地区和名称。

当前记录为:
- 地区:
China Top - 二级域名:
easynvr
然后回到【隧道管理 → 隧道列表】,找到:
easynvr

点击编辑,把域名类型改成:
二级子域名
再填写已经保留的子域名。

更新以后,在线隧道列表会切换成固定二级子域名形式。

继续使用 HTTPS 访问。

页面可以正常打开。
总结
这套方案真正让我觉得有价值的地方,不是"摄像头从此什么费用都没有",而是录像保存和历史回放终于可以落到自己控制的 NAS 上。摄像头继续负责采集,EasyNVR 负责集中接入、录像和回放,飞牛负责存储,cpolar 只补远程 Web 入口,四层职责分开以后,哪里出了问题也更容易定位。
这次实际跑通的链路是:
飞牛 SSH → Docker → EasyNVR → /vol1/1000/Photos/EasyNVR → 摄像头 IP-MAC 绑定 → 192.168.50.127 → RTSP → PotPlayer 验证 → EasyNVR PULL → 每天录像 → 直播 → 历史回放 / 下载 → cpolar → 10000 → 随机公网 → 固定二级子域名 easynvr。
几个关键技术点包括:
- 镜像:
registry.cn-shanghai.aliyuncs.com/rustc/easynvr_amd64:latest - Docker 网络:
--network host - 日志限制:
max-size=50M - 相册路径:
/vol1/1000/Photos - 录像目录:
/vol1/1000/Photos/EasyNVR - EasyNVR Web 端口:
10000 - 摄像头示例 IP:
192.168.50.127 - RTSP 示例:
rtsp://admin:admin123@192.168.50.127/live/ch00_0 - cpolar Web UI:
192.168.184.137:9200 - 隧道名称:
easynvr - 地区:
China Top - 固定二级子域名:
easynvr
如果家里已经有 NAS,这套思路最实用的部分就是:先把录像留在本地,再决定需不需要远程访问。相比一开始就追求"全品牌、全协议、完全替代云服务",先把一台摄像头的 RTSP、录像和回放真正跑通,会更稳。