群晖 NAS 部署 go2rtc,让 UniFi Protect 摄像头在浏览器直接播放
2026/9/19 13:05:04 网站建设 项目流程

群晖 NAS 部署 go2rtc,让 UniFi Protect 摄像头在浏览器直接播放

【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc

先说问题:UniFi Protect 的流,浏览器够不着

装了 UniFi Protect 之后,看回放只能在 App 或 Protect Console 里点着看,想把某路画面丢到 Home Assistant 的卡片上、或者在浏览器标签页里随手瞟一眼,就卡住了:Protect 对外提供的 RTSP 地址要拼 token,RTSPS 的自签证书又常被播放器拒之门外,浏览器更是压根不认识 RTSP。

go2rtc 就是个专门干这件事的中间层:它把各路摄像头流(RTSP、RTSPS、ONVIF、WebRTC 之类)统一吃进来,再吐出 RTSP、HLS、WebRTC、HomeKit 等标准格式,转封装为主,不做全量转码,所以对 NAS 的 CPU 压力很小。

前提速览

开始之前确认这四项就行,后面步骤里会用到:

  • 一台能跑 Container Manager 的群晖(Docker Manager 同理);
  • 摄像头的流地址:rtsp://<UniFi控制器IP>:7441/<token>,token 就是 Protect 里该摄像头唯一的标识符,一串十六进制字符;
  • 确认过该地址用 VLC 能直接拉出来(后文排障会反复用到这一点);
  • 打算让 go2rtc 常驻的 NAS IP 和三个端口,下一节细说。

必须映射的三个端口

在 Container Manager 里拉一个 go2rtc 镜像,创建容器时端口映射只需要关注这三个:

端口协议用途
1984TCPWebUI 和 HTTP API,配置、取流、取截图都走它
8554TCPRTSP 服务端口,给 VLC 这类播放器用
8555TCP + UDPWebRTC 端口,UDP 必须一起映射,只开 TCP 的话 WebRTC 会时好时坏

容器本身不用挂配置文件、也不用设环境变量,起来就完事了。官方仓库的 docker/Dockerfile 里EXPOSE 1984 8554 8555 8555/udp就是这个意思。

⚠️ 注意一点:这三个端口默认对局域网全开,也就是说同一网段里任何设备都能不加认证地看你的摄像头。只给自己用的话,建议后面在 WebUI 里把监听地址改成127.0.0.1:1984这种形式,把管理口收回到本机(详见项目说明里的 listen 配置一节)。

在 WebUI 里配置流源:最容易漏的一步

容器起完,go2rtc 并不会自己去找什么配置文件——流源要打开http://<NAS的IP>:1984进 WebUI,点顶部的config选项卡,把摄像头贴进去,然后点左上角Save & Restart。很多人把流地址写进了容器环境变量或者宿主机上的文件,结果页面里怎么都找不到自己的摄像头,问题就出在这一步。

UniFi Protect 的写法,streams下每个名字对应一组源,go2rtc 会按顺序尝试:

streams: front-door: - rtsp://192.168.1.1:7441/61287b2e05a1c4d1e9f8a7b6c5d4e3f2 - rtsps://192.168.1.1:7441/61287b2e05a1c4d1e9f8a7b6c5d4e3f2?enableSrtp

两个要点:

  • front-door是你自己起的名字,后面所有取流地址都靠它;7441是 Protect 控制器的端口,token 换成摄像头自己的那串;
  • 同时写两条源时 go2rtc 会自动挑能用的那条,不用手动指定。

再补一个 UniFi 专属的坑:go2rtc 官方 RTSP 文档里明确提到,Ubiquiti 用户建议用rtspx://前缀代替rtsps://,并且不要带?enableSrtp后缀rtspx本质是走 RTSPS 但跳过证书校验,正好治 Protect 自签证书的病,原文:

streams: front-door: - rtspx://192.168.1.1:7441/61287b2e05a1c4d1e9f8a7b6c5d4e3f2

这条写法在仓库的 pkg/rtsp/README.md 里可以找到。

验证:三个入口,分别试一次

配完保存之后别急着往下走,先用下面的方式确认链路通了,能省掉后面一大半的排障时间。

浏览器(HLS 方式)

WebUI 首页默认就有内置播放器,选中front-door直接出画面;也可以手动访问这个 HLS 地址:

http://<NAS的IP>:1984/api/stream.m3u8?src=front-door

VLC(RTSP 方式)

打开rtsp://<NAS的IP>:8554/front-door。给 Home Assistant、Frigate 这类要 RTSP 源的客户端填的也是这个格式,加?mp4参数还能让它输出 MP4 兼容编码(H264/AAC)。

WebRTC(低延迟方式)

WebUI 的 stream 页面切到 WebRTC 模式试试,走的就是 8555 端口。局域网内延迟最低,但要确认 UDP 映射到位了。

哪一条能出画面,就说明"源 → go2rtc → 目标格式"整条链路 OK。另外 WebUI 的net页会把当前实际的数据流画成拓扑图(摄像头 → 解码 → 输出),流走没走、走的是哪条源,一眼可见,排查时很好用。

排障:按出现频率排

流名对不上,报 "stream not found"

九成是配置没真正保存生效,或者访问时用的名字和streams下写的差一个字符。去 config 页确认流名,再确认点过 Save & Restart;顺带用 VLC 直接拉一遍源地址,先把"摄像头本身能不能出流"这个变量排除掉。

RTSPS 证书校验失败

优先把源前缀从rtsps://改成rtspx://(同时去掉?enableSrtp),这是 UniFi 场景下最干净的解法;如果必须保留 rtsps,就按上文的写法带上?enableSrtp,或在配置里加insecure_skip_verify: true跳过校验。

源是 H265,部分播放器播不了

UniFi 新版固件默认可能出 H265,浏览器对 H265 支持参差不齐。取流时加&mp4参数(如.../api/stream.m3u8?src=front-door&mp4)让 go2rtc 输出 MP4 兼容编码,或在 Protect 里把该摄像头编码切回 H264。

8555 只映射了 TCP,WebRTC 时有时无

回到容器设置补上 UDP。局域网播放 HLS/RTSP 不受影响,别被这个现象带偏去查摄像头。

进阶方向

基础链路通了之后,还有几件事值得顺手做:把api/rtsp/webrtc的 listen 地址收紧到本机或指定网卡,避免局域网裸奔;多路摄像头就各起各的流名,别挤在一条流里;有转码需求时再考虑接硬件加速(仓库的 docker/hardware.Dockerfile 就是为此准备的镜像)。录制、HomeKit 接入、双向对讲这些能力都在同一套配置体系里,官方 README 里有完整示例可查。

【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询