只用3个配置文件,把家里7台摄像头统一到浏览器里看:go2rtc实战部署
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
家里陆续添了不同品牌的摄像头:大华的、TP-Link Tapo的、还有一台只支持ONVIF的杂牌,以及一个连接着Home Assistant的监控环境。每一台都要装各自的App,在手机和电脑上分别登录查看,延迟还特别高——点开预览要等两秒画面才出来。
如果你也有类似的烦恼,那么 go2rtc 值得花一个下午折腾一下。这是一个开源的"终极摄像头流媒体网关",用 Go 编写,零依赖单文件,能同时兼容 RTSP、ONVIF、WebRTC、HomeKit 等几十种协议,把不同品牌摄像头统一成"一个浏览器页面"就能看的流服务。这篇文章我不打算写成一个功能清单式的介绍,而是按我实际的调试过程,从一个最小可用的配置开始,一步一步加功能:先让画面能看,再解决多设备兼容和延迟,最后加上语音对讲和推流到直播平台。每一层我都会告诉你"为什么要这么加"以及踩过哪些坑。
先花5分钟把"最小可用"跑起来
go2rtc 的部署门槛比我预想的低很多。它连依赖都不用装——不需要 Python、不需要 Node,甚至不需要 FFmpeg(只有需要转码时才用到)。你只需要:
- 到项目 releases 页下载对应平台的单文件二进制(Linux 选
go2rtc_linux_amd64,树莓派选go2rtc_linux_arm64,Windows 选go2rtc_win64.zip) - 给它执行权限并运行
chmod +x go2rtc_linux_amd64 ./go2rtc_linux_amd64预期结果:终端出现api、rtsp、webrtc等模块启动日志,然后保持前台运行。此时打开浏览器访问http://localhost:1984,你会看到一个简洁的 Web 界面,这就是 go2rtc 的配置和播放入口。
要点:默认端口有三个——
1984是 Web 界面和 HTTP API,8554是 RTSP 服务,8555是 WebRTC 连接(TCP/UDP)。如果你要远程访问,路由器上要放行这些端口。
go2rtc 启动时会自动在当前目录寻找go2rtc.yaml作为配置文件。如果没有这个文件,它也能空跑起来。接下来就是往配置里塞第一个摄像头。
从零开始写第一份 go2rtc.yaml:接入一个 RTSP 摄像头
我的第一台摄像头是大华的,RTSP 地址是rtsp://admin:密码@192.168.1.100:554/cam/realmonitor?channel=1&subtype=0。新建go2rtc.yaml:
streams: dahua_gate: rtsp://admin:密码@192.168.1.100:554/cam/realmonitor?channel=1&subtype=0保存后重启 go2rtc(或直接在 Web 界面里改配置,它会热加载)。然后在浏览器打开http://localhost:1984/stream.html?src=dahua_gate。
预期结果:页面上出现摄像头实时画面。注意看,go2rtc 会自动选择 WebRTC 作为传输方式——这也是它最大的卖点之一,WebRTC 在局域网内能把延迟压到几百毫秒以内。
避坑:不同品牌 RTSP 路径差异很大。海康一般是
.../Streaming/Channels/101,TP-Link 是.../stream1,Reolink 是.../h264Preview_01_main。如果连不上,先在 Web 界面的对应流上查看报错日志,再用 VLC 验证一下原始 RTSP 地址是否本身可用。
这里有个非常实用的知识点:?subtype=0是主码流(高清),subtype=1是子码流(低分辨率)。如果你只是想快速预览,用子码流加载更快;需要看细节时才切主码流。go2rtc 允许你在同一个流名下配置多个源,它会在其中自动选择、匹配。
把第二层加上:多源多协议,让一个流名承载所有设备
当第二台、第三台摄像头陆续进场,问题就来了:一台只支持 ONVIF,一台是 TP-Link Tapo(不支持标准 RTSP 直连),还有一台接在 Home Assistant 里。我不想在配置文件里维护三套 URL,更不想在浏览器里开三个页面。这时候可以给同一个流配置多个来源:
streams: courtyard: - rtsp://admin:密码@192.168.1.100:554/cam/realmonitor?channel=1&subtype=0 - rtsp://admin:密码@192.168.1.100:554/cam/realmonitor?channel=1&subtype=1 - onvif://admin:密码@192.168.1.101:80 tapo_door: - ffmpeg:tapo://admin:密码@192.168.1.102courtyard这个流名下挂了主码流、子码流和一台 ONVIF 摄像头,go2rtc 会按需从合适的源取流。tapo_door里那个ffmpeg:前缀值得特别说明:Tapo 这类封闭协议的摄像头,go2rtc 已经内置了原生支持,tapo://是它专有的源类型,会自动调用 FFmpeg 帮你做必要的封装转换。
go2rtc 的设计可以概括为"输入层任意协议,输出层任意格式",中间的协议转换对使用者透明
要点:go2rtc 支持几十种摄像头专有协议——TP-Link Tapo/Kasa、Wyze、小米、Tuya、Ring、GoPro、Nest 等都有内置支持,这在同类工具里非常罕见。如果你的摄像头"不支持 RTSP",先查一下 go2rtc 的模块列表,很可能直接写
品牌名://就行。
现在,浏览器打开stream.html?src=courtyard能看到庭院画面,src=tapo_door能看到门铃画面。但还有一个现实问题:家里的电视、客厅的 Home Assistant、偶尔用手机 4G 网络在外面看,这些场景用的播放技术完全不同。这正是 go2rtc 最值钱的能力——自动编解码协商。
让每个设备都能看:编解码协商与 HLS/MSE 自动适配
go2rtc 的 Web 前端会检测当前浏览器的能力,自动在 WebRTC、MSE(Media Source Extensions)、HLS、MP4 这些传输方式之间做选择。背后的逻辑可以概括成三条优先级:
- 优先选音视频都齐全的
- 优先选更清晰的编码(H265 > H264)
- 传输方式上 WebRTC > MSE > HLS > MJPEG
这个顺序背后是有原因的。举个例子:如果你的摄像头输出 H265 编码,但你的旧笔记本浏览器不支持硬解 H265,go2rtc 会自动回退到 H264 的源,或者在必要时调用 FFmpeg 做转码。它不会傻乎乎地把 H265 原样推给你。
对于苹果设备,iPhone 和 iPad 不支持 HTTP 渐进式流媒体,必须用 HLS。go2rtc 会自动感知到这一点,给 iPhone 走 HLS,给桌面 Chrome 走 WebRTC——同一套配置,不同设备看到的是不同的传输链路,但体验都是即开即播。
streams: courtyard: - rtsp://admin:密码@192.168.1.100:554/cam/realmonitor?channel=1&subtype=0 - rtsp://admin:密码@192.168.1.100:554/cam/realmonitor?channel=1&subtype=1 - onvif://admin:密码@192.168.1.101:80 - ffmpeg:${input}#video=h264#audio=aac注意最后一行:${input}表示"引用本流已有的源",#video=h264#audio=aac表示"如果需要,把它转码成 H264 + AAC"。这条规则保证了任何不支持原始编码的设备都能兜底。${input}这个变量语法我在别的流媒体软件里很少见到,写起来非常顺手。
预期结果:手机(4G 网络)访问http://你的公网IP:1984/stream.html?src=courtyard,画面在 1~2 秒内出来,且能正常出声。
避坑:如果你只配置了 H265 源,又没加 FFmpeg 转码兜底,桌面 Chrome 一般没问题(新版已支持),但 Firefox 会黑屏。判断方法是看 Web 界面里流的编解码信息——这是 go2rtc 排查"为什么没画面"的第一入口。
双向语音对讲:WebRTC 的隐藏福利
我一直以为语音对讲是要靠各家厂商 App 的,直到在 go2rtc 里试了一次,才发现这个功能被很多教程忽略了。go2rtc 对支持双向音频的摄像头提供了backchannel能力——RTSP、ONVIF、Tapo、Dahua、TP-Link 甚至小米都在支持列表里。
配置只需要一行:
streams: doorbell: - rtsp://admin:密码@192.168.1.102:554/stream1 - backchannel:rtsp然后在浏览器打开http://localhost:1984/webrtc.html?src=doorbell&media=video+audio+microphone,授权浏览器使用麦克风后,就能对着摄像头喊话了。
提醒:浏览器只有 HTTPS 页面下才会允许调用麦克风,这是浏览器的安全限制。如果你是通过 IP 直连访问的 HTTP 页面,对讲功能会被浏览器拦截。解决方案是给 go2rtc 套一层反向代理(Nginx/Caddy)加 HTTPS 证书。
预期结果:打开带microphone参数的页面后,画面下方出现麦克风按钮,点击说话,摄像头扬声器出声。
我第一次配置时踩过一个坑:摄像头默认把音频设成了 AAC 编码,但部分老款摄像头对讲只支持 PCMA/PCMU 低码率编码。这时候需要在 RTSP 源上补一条 FFmpeg 转码规则,把音频转成摄像头能接收的编码:
doorbell: - rtsp://admin:密码@192.168.1.102:554/stream1 - ffmpeg:${input}#audio=pcma - backchannel:rtsp如果你不知道怎么判断摄像头支持哪种编码,go2rtc 的 Web 界面在流启动后会直接显示可用的音频编码,对着抄就行。
看效果、查问题:用好 Web 界面的两块"透视镜"
到了这一步,你的 go2rtc 应该已经能同时服务好几路流了。接下来我强烈建议你打开两个页面,它们相当于流媒体服务的仪表盘和体检报告。
第一个是配置页。在http://localhost:1984/config可以直接编辑go2rtc.yaml,带语法高亮和校验,改完即生效,比在服务器上 vim 改文件直观得多。
配置界面支持热更新,这也是我调试多路流时效率最高的方式
第二个是网络拓扑页http://localhost:1984/net。它会以节点图的形式展示当前所有活跃连接:哪台设备在看哪路流、走的什么协议、传输了多少数据、延迟多少,一目了然。
当某一路流"卡住"时,这张图能帮你快速定位是源端问题还是客户端问题
避坑:如果某路流在 net 页里显示异常断连,先检查摄像头固件本身是否稳定。README 里其实有一段很诚恳的厂商体验表:Reolink 某些型号的 RTSP 实现"惨不忍睹",TP-Link 有掉包问题,杂牌摄像头普遍"勉强能用"。这些问题不是 go2rtc 的锅,但 go2rtc 能做的,是让你在同一个界面里看到这些异常,而不是被各家 App 的模糊报错糊弄过去。
最后一块拼图:转码资源控制与安全收口
当摄像头多到 7 台、同时还要给 Home Assistant 和手机端供流时,有两件事必须处理:转码开销和访问安全。
关于转码,go2rtc 的设计原则是"能 copy 就不转码,只有必要时才转"——因为每次转码都意味着 CPU 开销。我家的树莓派扛不住太多路 H265 转码,所以我的做法是:支持硬解的源直接传原码流,只有老设备访问时才走 FFmpeg 转码。如果你有 Intel 核显或 NVIDIA 显卡,还可以启用硬件加速:
ffmpeg: hwaccel: vaapi vaapi_device: /dev/dri/renderD128要点:FFmpeg 的
#video=copy#audio=copy表示完全不解码直接封装转发,几乎零 CPU 占用。能用 copy 的地方绝不要为了"好看"去转码。
关于安全,这一点很容易被忽略,但必须提醒你:go2rtc 默认把 Web 界面、RTSP、WebRTC 三个端口都暴露在局域网里,也就是说你局域网里的任何设备都能无密码看你的摄像头画面。如果只是家里用,风险可控;但如果你的局域网里有不可信的设备,或者端口映射到了公网,就一定要收口:
api: listen: "127.0.0.1:1984" # 只允许本机访问 Web 界面 local_auth: true username: admin password: 你的强密码 rtsp: listen: "127.0.0.1:8554" # RTSP 也只绑定本机 webrtc: listen: ":8555" # WebRTC 端口保持对外开放(媒体传输本身是加密的)其中local_auth: true配合账号密码,即使本机访问也要认证。外部访问统一走反向代理加 HTTPS,这样既安全又不破坏 WebRTC 的加密传输链路。注意不要把 API 暴露到公网——通过 API 可以调用exec这类模块,等于给攻击者开了一扇直达服务器的门。
做完这一步,这套系统就可以长期稳定跑了。我目前的使用形态是:Home Assistant 通过 go2rtc 的集成把 7 路摄像头全部纳管,手机端用浏览器看实时画面,需要回看时通过 FFmpeg 源录像到 NAS。当初折腾它花了差不多一个周末,但现在新增一台摄像头只需要在配置里加一行——这个收益,比省下那几台摄像头的品牌 App 要划算得多。
如果你想更进一步,可以试试这几条路:把一路摄像头流推送到 YouTube 或 Telegram 直播(配置里publish段直接写 RTMP 地址);用preload让常开的摄像头在 go2rtc 启动时就预取流,缩短首次打开的画面延迟;或者直接读一读www/README.md,用官方提供的 JavaScript API 给自家项目定制一个播放器。
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考