家里的监控别急着换:go2rtc 把 RTSP、WebRTC 和 Home Assistant 接到一起
摄像头协议不统一、浏览器打不开、Home Assistant 延迟高?go2rtc 用一个轻量服务把常见视频流接到一起,同时把鉴权、端口和编码限制讲清楚。

家里装了几只摄像头之后,麻烦往往不在“有没有画面”,而在于:摄像头只会输出 RTSP,浏览器更喜欢 WebRTC 或 MSE;手机、 Home Assistant 、 Frigate 又各自需要不同的输入格式。最后常见的解决办法,是在机器上堆一层 FFmpeg 、 Nginx 或各种厂商插件。
go2rtc 处理的就是这层连接工作。它是一个用 Go 编写的轻量级摄像头流媒体服务,能把 RTSP 、 RTMP 、 WebRTC 、 HLS 、 MSE 、 ONVIF 、 HomeKit 等输入输出接到一起,也能为部分摄像头提供双向语音。项目支持 Windows 、 macOS 、 Linux 、 FreeBSD 和多种 ARM 设备,单个二进制即可运行;仓库采用 MIT 协议。
这不是“把任何摄像头一键变成浏览器视频”的魔法工具。它最有价值的地方,是把视频流的输入、协议选择、浏览器兼容和必要的转码集中到一个地方管理。
它能解决哪些问题
1. 摄像头只给 RTSP,浏览器却打不开
RTSP 很适合摄像头和 NVR 之间传输,但浏览器不能直接把 RTSP 当成普通网页视频播放。 go2rtc 可以把同一条源流以 WebRTC 、 MSE 、 HLS 、 MP4 、 MJPEG 等形式输出。
其中,WebRTC 通常更适合实时预览;MSE 适合支持该能力的浏览器;HLS 兼容面较广,但直播延迟通常更高。最终效果取决于浏览器、摄像头编码、网络状况和是否需要转码,不能把“低延迟”理解成固定数值承诺。
2. Home Assistant 和 Frigate 需要一条稳定的视频入口
go2rtc 已被 Home Assistant 2024.11 及更新版本、 Frigate 0.12 及更新版本等项目使用。它既可以独立运行,也可以作为 Home Assistant 生态中的一部分运行。
典型链路是:
摄像头 / NVR
↓ RTSP、ONVIF 或厂商私有协议
go2rtc
├── WebRTC:网页实时预览
├── RTSP:给 Frigate、FFmpeg 或其他服务
├── HLS / MSE / MP4:给不同浏览器或播放器
└── HomeKit:接入 Apple 家庭
3. 音频格式对不上
视频能看到、声音却没有,是监控场景里很常见的问题。 go2rtc 会根据客户端支持的编码进行匹配;如果源流和浏览器之间确实不兼容,可以把 FFmpeg 作为另一个源加入同一条流,让它只负责必要的音频或视频转码。
项目文档特别提醒:PCMA 、 PCMU 属于质量较低的音频编码;FFmpeg 转码会消耗 CPU,硬件加速是否可用也要看主机和配置。不要为了“全浏览器兼容”默认开启全量转码,先确认真正不兼容的那条轨道。
最小可用配置
下载与你系统匹配的 Release 文件后,Linux 或 macOS 需要补执行权限:
chmod +x go2rtc_linux_amd64
./go2rtc_linux_amd64
启动后访问:
http://localhost:1984/
默认端口为:
1984:Web 界面和 HTTP API8554:RTSP 服务8555:WebRTC,使用 TCP/UDP
在同目录创建 go2rtc.yaml,先写一条摄像头流:
streams:
hall-camera: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0
把示例中的用户名、密码、地址和路径换成摄像头实际提供的 RTSP 地址。不要把示例密码原样用于真实设备。

Web 界面自带 YAML 编辑器、语法高亮和检查。配置好之后,可以通过项目提供的 API 或网页入口继续访问这条流。
Docker 和 Home Assistant 怎么选
如果主机已经使用 Docker,官方提供了:
docker run -d \
--name go2rtc \
-p 1984:1984 \
-p 8554:8554 \
-p 8555:8555/tcp \
-p 8555:8555/udp \
-v "$PWD/go2rtc.yaml:/config/go2rtc.yaml" \
alexxit/go2rtc
官方镜像支持 amd64 、 386 、 arm/v6 、 arm/v7 和 arm64,并预装 FFmpeg 与 Python 。实际部署时,建议先在局域网内验证端口和配置,再决定是否让其他设备访问。
Home Assistant 用户可以选择官方 add-on,也可以让 WebRTC Camera 集成自动下载和使用 go2rtc 。两种方式不要重复部署后又忘记自己到底连接的是哪个实例,否则排查端口和配置会变得很麻烦。
浏览器兼容,关键在编码
go2rtc 支持很多协议,并不代表每个浏览器都支持每种编码。 H.264 的兼容性通常最好;H.265/HEVC 在不同浏览器和系统上的支持差异更大。苹果设备还存在 HLS 、 MSE 和 HTTP progressive streaming 之间的兼容差异。
项目文档给出的处理思路是:
- 先确认摄像头输出了哪些音视频编码;
- 再确认目标浏览器支持哪些编码;
- 能靠筛选解决,就不要转码;
- 只有确实没有共同编码时,才引入 FFmpeg 。
例如,给 RTSP 输出加上编码筛选:
rtsp://192.168.1.123:8554/hall-camera?video=h264,h265&audio=aac
这类筛选只是在已有轨道中选择合适的编码,并不会凭空生成新编码。需要新编码时,才是 FFmpeg 转码的工作。
双向语音不是所有摄像头都支持
go2rtc 为部分 DoorBird 、 Hikvision 、 Ring 、 Tapo 、 Tuya 、 Wyze 、小米等设备提供双向音频支持,也支持通过 WebRTC 在浏览器中使用麦克风。
这里有两个限制容易被忽略:
- 摄像头本身必须具备可用的扬声器、麦克风和对应协议支持;
- 浏览器访问麦克风通常要求 HTTPS,不能只因为画面能打开,就认为对讲一定可用。
因此,建议先用一台非关键摄像头测试“看画面、听声音、说话、设备播放”四个方向,再部署到全屋设备。
WebUI 里还能看到什么
除了配置,WebUI 还可以查看当前连接、 IP 地址、协议、格式、数据包和传输字节数。这些信息适合定位“到底是摄像头慢、转码慢,还是客户端协商失败”。

如果只是盯着预览画面,很难判断延迟来自哪一段;连接图和流统计能提供更直接的线索。不过,监控系统本身也会暴露设备 IP 、流地址和访问行为,界面截图不要直接公开真实内网地址。
最需要重视的安全设置
官方 README 对安全问题的提醒很直接:如果攻击者拿到了 API 访问权限,就可能利用 echo、exec 等能力,进一步控制服务器。
而且,go2rtc 默认会把 Web 界面、 RTSP 和 WebRTC 端口提供给局域网访问。只要设备处在一个不完全可信的网络里,或者你把端口转发到了公网,就不能把“家里内网”当成安全边界。
最稳妥的起步方式是:
- 不把
1984、8554、8555直接暴露到公网; - WebUI 需要远程访问时,使用带鉴权的反向代理或安全的 VPN;
- 摄像头密码使用独立的强密码,不与路由器、 NAS 或其他服务复用;
- 对
api、exec和模块做最小权限配置; - 外网 WebRTC 需要规划 TCP/UDP 端口和访问控制,不要只开放一个端口就假设链路安全;
- 升级前备份
go2rtc.yaml,并检查新版本的配置变化。
项目文档给出的收紧示例:
app:
modules: [api, rtsp, webrtc, exec, ffmpeg, mjpeg]
api:
allow_paths: [/api, /api/streams, /api/webrtc, /api/frame.jpeg]
local_auth: true
exec:
allow_paths: [ffmpeg]
如果只需要本机访问 API 和 RTSP,还可以监听本地回环地址:
api:
listen: "127.0.0.1:1984"
rtsp:
listen: "127.0.0.1:8554"
这会减少局域网暴露面,但也意味着其他设备无法直接访问对应服务。 Home Assistant add-on 的访问模型还涉及 Home Assistant 自己的 Ingress 鉴权,不能把独立部署和 add-on 的安全边界混为一谈。
它适合谁,不适合谁
go2rtc 适合这些场景:
- 有多品牌摄像头,需要统一接入 Home Assistant;
- 使用 Frigate,需要把摄像头流稳定地提供给录像和检测服务;
- 想在浏览器里低延迟查看局域网摄像头;
- 有 RTSP 、 RTMP 、 ONVIF 或厂商私有协议,需要做协议桥接;
- 想用一台小主机、树莓派或 NAS 运行本地视频流服务。
它不适合被当成:
- 自动修复所有厂商私有协议的万能转换器;
- 不需要考虑编码和硬件资源的“零成本转码器”;
- 自带公网身份认证、账号体系和完整权限管理的成品监控平台;
- 可以替代摄像头厂商云服务全部功能的产品。
与 FFmpeg 相比,go2rtc 更像一个长期运行的流路由和协议桥接层;FFmpeg 更擅长具体的转码、滤镜和媒体处理。与 MediaMTX 这类通用流媒体服务器相比,go2rtc 的特色更集中在摄像头、 Home Assistant 、 Frigate 、双向音频和浏览器播放场景。怎么选,取决于你是要搭建通用推流基础设施,还是要把家里的摄像头接进一套本地自动化系统。
结语
go2rtc 值得关注的地方,不是它把所有视频协议都列在 README 里,而是它把家庭摄像头场景里最容易互相打架的几层东西放到了一起:源流接入、浏览器播放、音视频协商、必要转码、双向音频和本地自动化集成。
如果只是想看一只摄像头,厂商 App 可能更省事;如果已经有多品牌设备、 Home Assistant 、 Frigate 或 NAS,go2rtc 才会显示出价值。部署时先从局域网、单路流和只读预览开始,确认编码、延迟和访问控制,再逐步加入录像、对讲和外网访问。
来源链接
- X 帖子:https://x.com/cycledecoded/status/2083400910596882462
- GitHub:https://github.com/AlexxIT/go2rtc
- 官方 Release:https://github.com/AlexxIT/go2rtc/releases
本文仅整理公开项目资料,不构成摄像头安全、网络安全或设备选型建议。