用 go2rtc 快速搭建摄像头统一接入方案:5 分钟跑通,一个地址看全所有品牌画面
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
go2rtc 是一款开源的零依赖流媒体网关,专门解决"摄像头品牌杂、协议多、浏览器看不了、延迟高"的接入难题。如果你手里同时有 RTSP、ONVIF、Tapo 等不同协议的摄像头,又不愿意给每个品牌单独装一个 App,这篇文章会带你从头把它跑起来,并一路打通多设备接入、浏览器低延迟查看和稳定运行。
先给结论:你缺的是一个"能收、能发、能转码"的中间层
摄像头接入的痛点通常不是摄像头本身,而是"每台设备各说各的话":大华和海康走 RTSP,TP-Link Tapo 走私有协议,老设备只剩 MJPEG,而你想在浏览器里看的流,往往和设备的输出格式对不上号。
go2rtc 的思路很简单:在摄像头和你之间放一个中间层,它负责把各路输入统一收进来,再根据"谁在看、用什么设备看"自动选择最合适的输出。三个看家本领值得先记住:
- 输入广:RTSP/RTSPs、ONVIF、RTMP、MJPEG,以及 Tapo、Tuya、Wyze、小米等私有协议都能直接当源。
- 输出自动匹配:同一个流,浏览器用 WebRTC 拿低延迟,手机 Safari 自动切 HLS,老播放器走 RTSP,它自己会协商。
- 按需转码:只有编码对不上时才调 FFmpeg 转码,平时零转码零拷贝转发。
这意味着配置好之后,你看监控不再需要记一串 IP 和端口,只需要记住一个 go2rtc 的地址。
第一步:5 分钟跑通第一路摄像头,最小可用配置
这个步骤解决的是"先看到画面再说"的问题。go2rtc 启动后默认开三个服务:Web 管理界面和 HTTP API 在 1984 端口,RTSP 服务在 8554 端口,WebRTC 在 8555 端口(TCP/UDP)。
最快的方式是用 Docker 起一个容器:
docker run -d \ --name go2rtc \ --network host \ --restart unless-stopped \ -v ~/go2rtc:/config \ alexxit/go2rtc这段配置做了两件事:--network host让 WebRTC、HomeKit 这类需要多端口/UDP 的协议不被端口映射卡住;-v ~/go2rtc:/config把配置目录挂出来,方便你在 Web 界面里直接改文件。不想用 Docker 的话,下载对应平台的二进制(Linux 桌面用go2rtc_linux_amd64,树莓派用go2rtc_linux_arm64),chmod +x后直接运行即可,它会在当前目录找go2rtc.yaml。
接下来创建配置文件,只放一条流:
streams: hall-camera: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0这条配置声明了一个叫hall-camera的流,指向你家那台大华摄像头的 RTSP 地址。保存后打开http://localhost:1984,点击hall-camera就能看到实时画面。
新手常见坑:1984 是 Web 界面,8554 是 RTSP 服务,8555 是 WebRTC 端口。如果局域网内另一个软件占了 8554,RTSP 起不来,日志里会直接报
listen :8554错误,改成别的端口即可。另外 WebRTC 需要 UDP,防火墙别只放行 TCP。
看图重点理解:配置不用手写命令行,Web 界面里这个 YAML 编辑器自带语法检查和保存重启按钮,改完点一下Save & Restart就生效。
第二步:从 1 路到 N 路,让不同品牌摄像头共用一套配置
看到第一路画面后,你自然会想"那把家里那几台也接进来"。这一步的收益是:以后所有摄像头共用一套配置、一个页面,不用再记住每个品牌各自的访问方式。
接入新摄像头时,先判断它支持什么协议,再写对应的源:
streams: hall-camera: - rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0 hik-camera: - rtsp://admin:password@192.168.1.124/Streaming/Channels/101 tapo-camera: - tapo://admin:password@192.168.1.125 old-webcam: - http://192.168.1.126/video.mjpeg这段配置里四台设备用了四种完全不同的话术:两台标准 RTSP、一台 TP-Link Tapo 私有协议、一台只有 MJPEG 的老网络摄像头。但在 go2rtc 里它们都是平等的"流",前端看监控时完全无差别。
看图重点理解:输入层把 RTSP、ONVIF、Tapo、MJPEG、FFmpeg 管道等全部收拢到中心,输出层再按需分发成 RTSP、WebRTC、MSE/MP4、HLS 等,中间还能挂双向音频。这就是"一个网关接所有"的形态。
这里有个需要权衡的选择:能直连的优先直连,转码只当备胎。标准 RTSP 摄像头直接写 URL 即可,零开销;Tapo、Tuya 这类没有标准 RTSP 的品牌,用它的私有协议前缀让 go2rtc 原生解析;只有实在接不进来的老设备,才考虑用ffmpeg:http://...包一层。
如果你把多个源写进同一个流名下,go2rtc 会把它们都当作该流的候选源,这为下一步的编解码协商埋下了伏笔。关于各协议的具体写法,可以在internal/streams/README.md里查到各品牌摄像头的参考 URL。
第三步:让浏览器零延迟看流,靠的是编解码自动协商
走到这一步你会发现一个尴尬:浏览器里画面黑屏,但 VLC 能放。原因十有八九是编码对不上——摄像头输出 H.265,你用的浏览器不支持;或者音频是 AAC,浏览器 WebRTC 只认 OPUS/PCMU/PCMA。
go2rtc 的解法是多源协商:同一个流可以挂两个源,一个直连原始流保证画质,一个走 FFmpeg 转出浏览器能吃的编码,看流时它自动按需取用:
streams: dahua: - rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0 - ffmpeg:rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0#audio=opus这段配置的核心是第二行:它把同一路源交给 FFmpeg,只把音频转成 OPUS。平时看视频走第一行的原始流,一旦浏览器要音频而编码不匹配,就自动从第二个源取。这就是 go2rtc 宣传的"多源双向编解码协商",也是它区别于普通 RTSP 中转的关键能力。
关于延迟,可以直接给结论:浏览器里 WebRTC 最优,MSE/MP4 居中,HLS 最差但最稳。所以 go2rtc 的前端播放器默认优先级是 WebRTC > MSE > HLS,它会探测你的浏览器支持什么就自动用什么。你基本不用手动干预。
新手常见坑:iPhone 的 Safari 不支持 HTTP 渐进式播放,老系统连 MSE 都不支持。如果你是苹果用户又遇到画面出不来,在播放地址里强制指定 HLS 模式通常是最后的兜底手段。
第四步:让接入更稳,预加载 + 硬件加速 + 可视化监控
多路画面都正常了,接下来是稳定性。三个动作各解决一类问题。
预加载解决"看的时候才拉流,响应慢"。有些摄像头启动要好几秒,等你去点画面才拉流体验很差。在配置里声明预加载,服务一启动就把流拉起来:
preload: hall-camera: gate-camera: "video"默认预加载音视频全轨;gate-camera只预载视频轨。省流的场景(比如只想留个缩略图)可以只预载视频。
硬件加速解决"转码吃满 CPU"。如果你确实需要转码,优先让 FFmpeg 走 GPU。在ffmpeg源后面加#hardware:
streams: high-res: - rtsp://admin:password@192.168.1.127/stream - ffmpeg:${input}#video=h264#audio=aac#hardware#hardware会让 go2rtc 自动探测本机可用的硬件加速(Intel、AMD、树莓派都覆盖),具体到你的显卡需要什么参数,以internal/ffmpeg/README.md和硬件文档为准。
可视化监控解决"不知道哪里卡"。点开 Web 界面的net页面,能看到当前所有活跃连接的拓扑:哪个摄像头在推流、每个连接传输了多少字节、走的什么协议,一目了然。
看图重点理解:节点颜色区分设备、流、编码和传输协议,连线上的数字是实时吞吐量。排查"为什么这路画面卡"时,先来这里看是不是带宽已经打满,再决定要不要加转码或降码率。
第五步:给服务上锁,认证和端口收敛一个都不能少
这一步解决的是"设备裸奔"问题。默认情况下 go2rtc 三个端口对局域网全开放,同网段任何人都能直接看你的摄像头画面,甚至通过 API 操作服务。对家庭网络信任度高可以不管,但一旦要暴露到公网,必须加固。
最省事的加固方式是加认证 + 把管理端口收到本机:
api: listen: "127.0.0.1:1984" username: "admin" password: "${GO2RTC_PASSWORD}" rtsp: listen: "127.0.0.1:8554"listen: 127.0.0.1把 Web 界面和 RTSP 服务收回到本机,局域网内不再直接可达;WebRTC 的 8555 端口只传输加密媒体数据,保持开放没问题。密码用${GO2RTC_PASSWORD}从环境变量读取,别明文写死在配置文件里。
如果要在公网看监控,正确姿势是:API 只监听本机,外面用带 HTTPS 的反向代理(Nginx/Caddy 都行)转发 1984 端口,认证交给代理层处理。go2rtc 官方安全建议里特别提醒过:API 一旦被攻破,攻击者可能通过 echo/exec 这类源拿到服务器执行权限,所以"不要图省事直接对公网裸奔 1984",这句话值得记牢。
最后:接入失败时,按这张自检清单逐项排查
如果哪一路画面迟迟出不来,别急着怀疑是 bug。90% 的情况都在下面这张表里:
| 症状 | 大概率原因 | 先查什么 |
|---|---|---|
| 点开画面一直转圈 | 摄像头地址或账号密码错 | 先用 VLC 直接拉原始 RTSP 验证 |
| 有画面没声音 | 音频编码浏览器不支持 | 给该流加ffmpeg:...#audio=opus备用源 |
| 延迟明显偏高 | 走了 HLS 或 MP4 兜底 | 确认浏览器支持 WebRTC,检查网络环境 |
| 局域网内偶尔断流 | UDP 端口未放行 | 确认 8555 的 TCP 和 UDP 都通 |
| CPU 飙高 | 触发了不必要的转码 | 检查是否有ffmpeg:源,确认能否直连 |
| 公网看不了 | NAT/防火墙问题 | 先本地看是否正常,再检查端口映射 |
排查顺序永远是"先本地、后网络、再转码":本地 VLC 能放,说明源没问题;本地 WebUI 能看,说明服务没问题;剩下的就是网络和编码层面的事。
回到开头那个痛点:多品牌摄像头、多种协议、浏览器看不了、延迟高——这套方案跑下来,你会发现 go2rtc 并没有发明什么新协议,它只是把"收、发、协商、转码"四件事做对并打包在了一起。从第一路摄像头的 5 分钟上线,到全屋设备的统一接入,再到浏览器零延迟查看和稳定运行,整个链路在一份 YAML 文件里就能完成。如果你的需求更进一步,比如给摄像头播放音频、推流到直播平台,internal/streams/README.md里还有publish和双向音频的现成用法,接上就能用。
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考