go2rtc:让任意摄像机变成低延迟流媒体源,转码与多协议分发一次搞定
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
深夜门铃响了,你想立刻看到画面,却忍受不了 3 秒延迟,厂商的私有接口又懒得折腾。go2rtc 是个单文件的流媒体网关:把摄像机的 RTSP 源拉下来,转成低延迟的 WebRTC、HLS、MP4 等格式分发出去,编码不匹配时再顺手转码。
为什么值得你花 5 分钟了解它
摄像机推流这件事,很多人第一反应是"找个媒体服务器转发一下",但真正的坑往往在别处:有的摄像机没有 RTSP,有的云摄像头音频编码浏览器播不了,录像设备想要 MP4、播放端想要 HLS。go2rtc 的定位比协议转发多走一步——它负责把源拿下来(包括一批私有云协议),按需决定是否转码,再把同一个源同时以多种协议吐出去。
一句话选型判断:想让"接上摄像机就能到处用、还能对讲",选它;如果你只是把 RTSP 原样转成 RTSP,纯转发工具更轻量,没必要引入它。
⚡ 3 条命令跑通 go2rtc 的 Docker 部署
官方镜像已内置 FFmpeg,转码开箱即用,不用再装依赖:
docker pull alexxit/go2rtc docker run -d -p 1984:1984 -p 8554:8554 -p 8555:8555/udp alexxit/go2rtc1984 是 Web 界面和 API 端口,8554 是 RTSP 服务端口,8555 是 WebRTC 端口,全部是默认值,不用改。备选路径一句话带过:下载单文件二进制直接跑(Linux/macOS 记得chmod +x),或者git clone https://gitcode.com/GitHub_Trending/go/go2rtc后用go build自己编译。
它能帮你搞定什么
家庭安防接入
- 云摄像头本地化:Tapo、Wyze、小米这类只能走厂商服务器的设备,可以直接拉成本地流,不再被云端限制
- 没有 RTSP 的摄像机:用 ONVIF 协议自动发现真实的 RTSP 地址和快照地址
- USB 摄像头:v4l2 模块把 Linux 上的本地摄像头直接当作流源,临时加个监控位置很方便
多协议互通
- 一份源多种出口:同一台摄像机同时输出 WebRTC(浏览器亚秒级)、HLS(兼容 iOS)、MP4(喂给 Frigate 录像)、RTMP(推 YouTube 或 Telegram)
- 编码自动匹配:它会自动探测你的浏览器支持什么编码,再从流的多路音轨视频轨里挑合适的,不用你手动指定
实时转码与双向对讲
- 按需转码:摄像机原生编码和客户端匹配时走纯转发、零转码开销;不匹配时才调用 FFmpeg,还能配置硬件加速
- 门铃对讲:给 RTSP、Tapo、Ring 等源加上
#backchannel=1,浏览器里就能直接喊话(注意:浏览器只在 HTTPS 页面开放麦克风,外网访问需套一层反向代理)
灵活拼流
- 多源混合:把不同来源的音轨和视轨拼成一个流,比如原始视频轨 + FFmpeg 转码出来的高音质音频轨
关键配置速查
最小可用配置只需要一个streams段,一行一个流:
streams: # ① 最常改:流名称和源地址 front: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0最常改的三个字段:① 流名称与源地址(上面这行);②api.listen,控制 Web 界面和 API 端口(默认 1984);③webrtc.listen,控制 WebRTC 端口(默认 8555)。不想手写 YAML 的话,可以在http://localhost:1984/config.html的 Web 编辑器里直接改,带语法检查和即时保存:
复杂玩法很多(编码过滤器?video=h264&audio=aac、FFmpeg 转码源ffmpeg:rtsp://...#audio=opus、预加载、推流发布等),配置项逐条说明可以看仓库里各模块的 README,internal/目录下每个文件夹都有一份,建议先看 internal/README.md 的功能总表。
🔧 RTSP 流延迟高、CPU 高、播不了?常见踩坑排查
症状:ffplay 或 VLC 播放延迟 1-3 秒
原因是播放器自身缓冲,不是传输层慢。解法:ffplay -fflags nobuffer -flags low_delay播放;或者直接在浏览器打开 WebRTC 页面,这才是 go2rtc 延迟最低的路径。
症状:iOS 设备播不了
iPhone 不支持 HTTP 渐进下载,老版本 iOS 没有 MSE,H265 还有兼容坑。解法:给 iOS 选 HLS 或 WebRTC 输出;若不支持 H265,加一路 FFmpeg 源转成 H264。
症状:转码时 CPU 占用飙高
FFmpeg 在做软解软编。解法:给 FFmpeg 配上你的硬件加速参数(VAAPI、NVENC、v4l2m2m 等);或者更彻底一点,把摄像机原生编码直接设置成和客户端一致,绕开转码。
症状:摄像机启动慢,第一次打开画面卡住
源还没建立完成。解法:用 preload 预加载功能,让 go2rtc 启动时就提前把流拉起来。
安全:默认配置最容易忽略的一件事
1984 和 8554 默认对局域网全开,同网段任何人不仅白嫖你的摄像头画面,还能调用 API 触发echo/exec模块执行命令。环境不完全可信时,把api和rtsp的listen改成127.0.0.1,只把 WebRTC 端口暴露出去,或给 1984 套一层带认证的反向代理。
生态与扩展方向
流的核心逻辑 internal/streams/ 暴露了清晰的 Producer/Consumer 接口,你可以照着实现一个自定义源;不开发生态的话,直接调 HTTP API 从自己的系统注册流更实用。整个项目本身按 Go 库的方式组织,internal/是协议与模块实现,pkg/是可复用的编解码和网络库,www/是 Web 页面资源,pkg/core/ 提供媒体流与轨道调度的基础抽象。
下一步
- 把家里最常用的那台摄像机接上,浏览器打开
http://localhost:1984/,在 WebRTC 页面播放并实测延迟 - 有门铃设备的话,给源加上
#backchannel=1,边看画面边体验双向对讲 - 翻一下仓库 issue 里有没有你要的摄像机型号或功能;没有的话直接提一个
接上第一台设备之后你会发现,所谓的"摄像机延迟问题"基本靠一份配置文件就能解决,剩下的只是为每个终端挑最合适的输出协议。
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考