go2rtc:把任意摄像头变成低延迟视频流的终极工具,从 RTSP 到 WebRTC 一个配置搞定
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
go2rtc 是一个零依赖的摄像机流媒体应用:你把摄像头的 RTSP 地址、ONVIF 地址甚至文件路径丢给它一份 YAML 配置,它就能同时输出 WebRTC、RTSP、HLS、MP4、MJPEG 等十几种协议的流,且多数协议接近零延迟。适合家里装了几个摄像头、想让手机浏览器和监控软件都能低延迟看画面的你。
家里有 3 个海康摄像头,为什么你需要一个"中间层"
先说两个真实场景。
场景一:你家装了 3 个海康摄像头,厂商 App 只能一台手机一个账号地登录,家人想在你家客厅电视上看,还得再装个 App。你希望手机浏览器打开一个网页就能看,延迟最好在 1 秒以内。
场景二:你用 Frigate 或 Home Assistant 做 AI 检测,它们需要标准 RTSP 输入,但你的摄像头 RTSP 实现有坑(SDP 畸形、只支持 UDP),ffplay 都能卡住。
go2rtc 就是站在摄像头和消费者之间的"流媒体中间层":它负责从摄像头把流拉下来(包括各种私有协议如 Tapo、Wyze、小米),再按需转成任何主流输出格式。你不用再关心每个客户端各自需要什么协议——一个源,全协议输出。
一张表看懂 go2rtc 能做什么
| 能力 | 说明 | 什么时候用得到 |
|---|---|---|
| RTSP 输入 + ONVIF 自动发现 | 输入摄像头地址即可,ONVIF 源还能自动探测 RTSP/快照链接 | 不知道摄像头 RTSP 地址时 |
| 私有云协议源 | Tapo、Wyze、小米、Ring、HomeKit 等 20+ 种 | 摄像头没有标准 RTSP 时 |
| 浏览器低延迟输出 | WebRTC(UDP/TCP),支持双向音频 | 手机/电脑浏览器实时查看、对讲 |
| 标准 RTSP 服务器 | 把任意源变成干净的 RTSP | 喂给 Frigate、Home Assistant 录制 |
| HTTP-FLV / HLS / MP4 | 多协议同时输出同一路流 | 移动端 FLV 播放器、iPhone 上的 HLS |
| FFmpeg 按需转码 | 仅在客户端 codec 不匹配时才转 | 摄像头出 H.265 但浏览器只吃 H.264 |
| 双向音频 / 音频推给摄像头 | 浏览器麦克风声音直接推到摄像头喇叭 | 门铃、对讲、TTS 语音播报 |
| 多源混合 | 一路流混多个源的视频+音频轨道 | 主视频走 RTSP、音频走转码源 |
| 推流发布 | 任意源推 RTMP 到 YouTube/Telegram | 直播、远程分享给同事 |
5 分钟跑通第一个 RTSP 流
这一步解决"从下载到看到画面"的最短路径。
安装三选一,二进制最简单:
# 1. 下载对应平台的二进制(项目 release 页面有 win/linux/mac/arm 各版本) chmod +x go2rtc_linux_amd64 # 2. 用 Docker 的话一条命令,镜像已内置 FFmpeg docker run -d --name go2rtc -p 1984:1984 -p 8554:8554 -p 8555:8555/udp alexxit/go2rtc # 3. 或者从源码编译 git clone https://gitcode.com/GitHub_Trending/go/go2rtc cd go2rtc go build -o go2rtc main.go # 看到 1984 端口开始监听即成功在当前目录放一个最小配置go2rtc.yaml,只写一行流:
streams: # 海康/大华类摄像头的 RTSP 主码流 camera1: rtsp://admin:password@192.168.1.100/Streaming/Channels/101默认启动三个服务:API 在1984端口、RTSP 在8554端口、WebRTC 用8555(TCP/UDP)。
验证成功的标志:浏览器打开http://localhost:1984/,进入 add 页面选camera1,画面出现即跑通。也可以在命令行里确认:
curl http://localhost:1984/api/streams # 返回 JSON,包含 camera1 这一路流即成功WebUI 的配置页支持语法高亮和在线保存(Save & Restart),不需要手动改文件重启:
按需求选观看方式:WebRTC / RTSP / HLS / MP4 各给一个最小示例
这一节回答"我拿到流之后,用什么协议消费最划算"。go2rtc 的核心价值是同一路camera1,以下 URL 全部同时有效,按需取用。
浏览器实时查看(WebRTC,延迟最低):内置 3 行接入代码。www/video-rtc.js会自动在 WebRTC / MSE / HLS 里挑当前浏览器+codec 支持的最优方案:
<video autoplay playsinline></video> <script src="http://localhost:1984/video-rtc.js"></script> <script> new VideoRTC({video: document.querySelector('video')}).play('camera1'); </script>不想写页面也可以直接开http://localhost:1984/webrtc.html?src=camera1。
喂给 AI 检测/录制软件(RTSP):go2rtc 把任意源重发为干净 RTSP,加查询参数还能指定 codec:
ffplay -fflags nobuffer -flags low_delay rtsp://localhost:8554/camera1 # 有画面且延迟约 200ms 即成功rtsp://localhost:8554/camera1?mp4会输出 H.264+AAC 的 MP4 兼容组合,专门给 Home Assistant / Frigate 录文件用。
iPhone 或移动端播放器(HLS):
# fMP4 格式 HLS,H.264/H.265 均可 curl "http://localhost:1984/api/stream.m3u8?src=camera1&mp4" -o /dev/null -w "%{http_code}\n" # 返回 200 即成功,把 URL 丢给任何 HLS 播放器逐帧快照 / 老式客户端(MJPEG):http://localhost:1984/mjpeg/camera1,直接丢给<img>标签或任意 MJPEG 客户端。
一句话记法:要延迟选 WebRTC,要兼容选 RTSP,要 iPhone 选 HLS,要省事选 MJPEG。
进阶玩法:转码、硬件加速与双向音频
这一节按"遇到什么问题 → 怎么配"的方式讲。
问题一:浏览器不播 H.265。摄像头出 HEVC,但 Firefox 和老 Safari 只吃 H.264。给流加一个 FFmpeg 转码源,go2rtc 会在客户端不支持时自动切过去:
streams: cam: - rtsp://admin:password@192.168.1.100/stream1 # 原流,能直连就不转 - ffmpeg:rtsp://admin:password@192.168.1.100/stream1#video=h264 # 备用转码源加#hardware参数可启用硬件加速(QSV/VA-API/NVENC 按平台自动选),模板在 FFmpeg 模块 里,你还能在配置里覆盖h264模板参数。
问题二:画面方向不对 / 要缩分辨率:#video=h264#rotate=90#width=1280即可,转码时参数生效。
问题三:摄像头麦克风音频 codec 与浏览器不匹配。摄像头只出 AAC 而 WebRTC 要 OPUS,加第二路转码音频源,go2rtc 会做多源 codec 协商,自动把视频和音频从不同源拼给浏览器:
streams: cam: - rtsp://admin:password@192.168.1.100/stream1 - ffmpeg:rtsp://admin:password@192.168.1.100/stream1#audio=opus # 只转音频问题四:想让摄像头"说话"(双向音频)。给 RTSP 源加#backchannel=1:
streams: doorbell: rtsp://admin:password@192.168.1.100/stream1#backchannel=1浏览器端开webrtc.html?src=doorbell&media=video+audio+microphone即可双向对讲(麦克风需 HTTPS 页面)。反过来把音乐/语音推到摄像头喇叭也行:
# 把本地音乐转码为 PCMA 后播到摄像头喇叭 curl -X POST "http://localhost:1984/api/streams?dst=doorbell&src=ffmpeg:http://example.com/song.mp3#audio=pcma#input=file"问题五:不知道摄像头的 RTSP 地址。用 ONVIF 源,它会自动探测出 RTSP 和快照链接(需在 ONVIF 模块 同一网段;Docker 用户记得--network host):
streams: cam: onvif://admin:password@192.168.1.100API 与二次开发:把 go2rtc 嵌进你的项目
go2rtc 自带完整 HTTP API(默认:1984),有 OpenAPI 描述,常用入口:
curl http://localhost:1984/api/streams # 列出所有流 curl http://localhost:1984/api/webrtc/iceServers # 拉 ICE 配置 curl http://localhost:1984/api/frame.jpeg?src=cam1 # 抓单帧快照二次开发有两类入口:
- 前端:www/ 目录里的
video-rtc.js和stream.html就是官方播放器实现,可直接抄进你的项目;www/static.go说明这些文件是编译进二进制的,你也可以用api.static_dir指向自己的前端目录。 - 后端:在 main.go 中,所有模块(
api、rtsp、webrtc、ffmpeg……)都以name + Init 函数注册,想加自定义源/协议,参照 internal/ 下任一模块实现core.Producer接口再注册一行即可,配置项通过 app 模块 的LoadConfig注入。
WebUI 的 net 页面用交互图展示每个连接走的是哪条链路、传了多少字节,排查"这路流到底有没有人看"非常方便:
生产部署要点:认证、TLS 与日志
如果你要把 go2rtc 部署到公司内网甚至公网,默认配置是不够的——默认情况下局域网内任何人无鉴权就能看你的摄像头。
只暴露必须暴露的端口:API 和 RTSP 绑到回环地址,WebRTC 的 8555 保留对外(它是加密媒体端口,WebRTC 需要):
api: listen: "127.0.0.1:1984" # API 只允许本机 username: "admin" # 或加 Basic 认证 password: "pass" rtsp: listen: "127.0.0.1:8554" webrtc: listen: ":8555" # 对外(加密媒体)HTTPS:api.tls_listen: ":443"+tls_cert/tls_key直接填 PEM 内容即可,不需要反代;浏览器麦克风权限也要求 HTTPS。
收窄攻击面:官方在 README 里特别警告——API 一旦泄露,攻击者可借exec/echo源执行命令。生产环境建议:
app: modules: [api, rtsp, webrtc, mjpeg] # 只加载需要的模块 api: allow_paths: [/api, /api/streams, /api/webrtc, /api/frame.jpeg]日志与监控:log.level: debug+log.file: go2rtc.log排障;运行时健康检查用GET /api/streams(200 即存活),连接级别监控看 net 页或 WebSocket API(ws 模块)。外部 WebRTC 访问需在路由器同时放行 8555 的 TCP 和 UDP。
踩坑与排查:5 个高频问题
现象 1:浏览器里没画面,终端日志报 codec 错误可能原因:摄像头出 H.265,浏览器不支持(Firefox 全系、老 Chrome/Safari)。解决:给流加ffmpeg:...#video=h264第二源,或先确认用 Chrome 136+ / Safari 18+(已支持 WebRTC H.265)。
现象 2:RTSP 客户端能连但延迟 2-3 秒可能原因:客户端默认缓存。解决:ffplay -fflags nobuffer -flags low_delay rtsp://localhost:8554/camera1,或 VLC 把 Default Caching Level 调到最低。
现象 3:Docker 里 ONVIF 发现不到摄像头可能原因:ONVIF 自动发现依赖同网段广播,bridge 网络收不到。解决:docker run --network host ...,或直接用 WebUI add 页手动填 ONVIF 地址。
现象 4:转码流 CPU 飙高可能原因:默认走软编 libx264。解决:转码源加#hardware参数启用 QSV/VA-API/NVENC,先在 WebUI add 页确认本机可用的硬件编码器;顺带关掉不用的drawtext时间戳叠加(它即使有硬编也吃 CPU)。
现象 5:iPhone 上流不动可能原因:Apple 设备不支持 HTTP 渐进式下载和 MSE(老 iOS),WebRTC 的 Safari 自动播放也有坑。解决:给 iPhone 单独走?src=cam1&mp4的 fMP4 版 HLS,或升级 iOS 17.1+ 让 MSE 可用。
文档与社区入口
配置全集见 README(含浏览器 codec 兼容矩阵),各协议细节分散在 internal/ 各模块 的 README 里,想深入播放器逻辑就翻 www/video-rtc.js。遇到怪问题先去 WebUI 的 log 页翻 debug 日志,比猜快得多。
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考