5 分钟把摄像头搬进浏览器:go2rtc 低延迟推流入门指南
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
go2rtc 是一款零依赖的摄像头流媒体应用(camera streaming application):你把一个 RTSP 地址丢给它,它就能立刻在浏览器里以接近实时的延迟播放视频,同时自动把这一路流转换成 WebRTC、HLS、MP4、MJPEG、RTSP 等十几种输出格式。对家庭用户、智能家居玩家、开发者来说,它是"摄像头协议大杂烩"问题的终结者——不管摄像头说的是 RTSP、ONVIF、RTMP 还是某家私有协议,进来之后统一出口。
一路输入、十几种输出:go2rtc 能干什么
先用一张表看清它的定位,再决定要不要花那 5 分钟:
| 能力 | 说明 | 典型场景 |
|---|---|---|
| 多协议输入 | RTSP、RTMP、HTTP、ONVIF、MJPEG,以及小米、TP-Link Tapo、Wyze、Ring、Nest、HomeKit 等大量私有协议 | 把"不听话"的摄像头接进统一平台 |
| 多格式输出 | WebRTC、MSE/MP4、HLS、RTSP、RTMP、MJPEG、HomeKit、ONVIF、WebTorrent | 同一路流同时喂给浏览器、FFmpeg、手机 App |
| 超低延迟 | 大量协议下零转码直通,延迟是各类流媒体方案中最低的一档 | 监控实时查看、对讲 |
| 双向音频 | 麦克风音频能推回摄像头扬声器(Tapo、Wyze、小米、ISAPI 等) | 喊话、远程语音 |
| 按需转码 | 内置 FFmpeg 源,只在必要时转码,支持硬件加速 | 转 H264/AAC、修正旋转角度 |
| 零依赖单文件 | 一个二进制跑遍 Windows / macOS / Linux / ARM | NAS、树莓派、软路由随便装 |
它的另一个身份是"流媒体路由器":Home Assistant、Frigate 等生态项目都直接把它当后端用,你通过 HTTP API 或 WebSocket API 可以把它集成进自己的项目。
5 分钟跑通:从一条命令到看到画面
这一步的目标只有一个——先看到视频。装哪种方式都行,Docker 用户用第 1 条,没有 Docker 的用第 2 条。
方式一:Docker(推荐,自带 FFmpeg)
docker run -d --name go2rtc --network host --restart unless-stopped \ -v ~/go2rtc:/config alexxit/go2rtc方式二:二进制
从 Releases 页面下载对应系统的压缩包(Linux/macOS 记得chmod +x),然后直接运行:
./go2rtc_linux_amd64看到进程正常启动后,浏览器打开http://localhost:1984/,这就是 go2rtc 的 Web 管理界面:
现在给它加一路流:点左侧配置入口,在streams下填一行你的摄像头地址,保存后界面会立刻出现这个流名,点进去就能看到画面(播放器会自动在 WebRTC、MSE、HLS、MJPEG 之间挑当前环境延迟最低的方案)。
streams: hall: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0到这里,最核心的链路已经跑通:摄像头 → go2rtc → 浏览器,中间没有中间商、没有转码。小结:配置里一行 URL 就是一个流,流名可以随意起,后面所有功能都围绕"流名"展开。
二进制 / Docker / 源码:三种安装方式怎么选
| 对比维度 | 官方二进制 | Docker 容器 | 源码编译(main.go 入口) |
|---|---|---|---|
| 适合谁 | 想最少折腾的普通用户 | 已有 Docker / NAS 环境 | 想改代码、跟最新版 |
| 上手成本 | 下载即跑 | 一条命令 | 需要 Go 环境 |
| 自带 FFmpeg | 否(需系统安装) | 是 | 否 |
| 硬件转码 | 需系统装好 FFmpeg + 驱动 | 有专用-hardware镜像(Intel/AMD/NV/RK35xx) | 自己折腾 |
| 升级方式 | 重新下载覆盖 | 拉新镜像 | 重新编译 |
选法很简单:日常使用选 Docker(镜像已预装 FFmpeg 和 Python,多架构支持 386 / amd64 / arm);只是想看一眼画面选二进制;要改代码或尝鲜再走源码(可用git clone https://gitcode.com/GitHub_Trending/go/go2rtc获取仓库,go run .即可启动)。镜像版本细节见 docker/README.md。
最小可用配置:一份真的能跑的 go2rtc.yaml
默认配置什么都不用写就能跑,但下面这三个部分是你几乎一定会碰到的。默认情况下 go2rtc 会在当前工作目录找go2rtc.yaml;Docker 里则是对应到/config的目录,也可以在 WebUI 里直接编辑(带语法检查)。
① streams:流的定义(核心)
streams: hall: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0 desk: ffmpeg:/media/test.mp4#video=copy # 用本地文件当"测试摄像头" tapo-1: tapo://192.168.1.100:cam1,admin,pass # 私有协议用专用前缀改什么 → 为什么:值是"协议前缀://凭据@地址",换摄像头只改这里。没有摄像头?用ffmpeg:前缀加一个本地 MP4 文件就能全流程试跑,这是新手最省事的测试手段。
② 端口:记住三个数字
| 端口 | 用途 | 说明 |
|---|---|---|
| 1984 | WebUI + HTTP API | 浏览器看画面、管理配置 |
| 8554 | RTSP 服务器 | 给 Frigate、FFmpeg、NVR 拉流 |
| 8555 | WebRTC(TCP/UDP) | 低延迟播放与外网访问都要靠它 |
③ 安全:别把 1984 裸奔在局域网里
默认三个端口对局域网全开,意味着同网段任何人不用登录就能看你的摄像头。最常用的一招是把 API 和 RTSP 收回本机:
api: listen: "127.0.0.1:1984" # WebUI 只允许本机访问,外网走反向代理 rtsp: listen: "127.0.0.1:8554"需要对外时再配合反向代理(Nginx/Caddy)或api.username/password加 Basic 认证。另外配置支持${ENV_VAR:default}环境变量语法,密码类信息建议走环境变量而不是明文写进 yaml,详见 internal/app/README.md。
WebUI 里的配置页长这样,改完点保存即生效(容器会因restart: unless-stopped自动重启加载):
可选进阶:FFmpeg 转码、多源协商与硬件加速
以下都属于"用到再看",不配置不影响前面的一切功能。
FFmpeg 源(按需转码)。格式是ffmpeg:{输入}#{参数},只在真的需要转码时才加,比如视频旋转了 90°、要把音频转成浏览器都认的格式:
streams: rotate: ffmpeg:rtsp://user:pass@192.168.1.123/stream#video=h264#rotate=90内置了h264、h265、aac、opus等模板,参数含义和覆盖方法见 internal/ffmpeg/README.md。
多源协商(最被低估的功能)。一个流可以挂多个源:原生 RTSP 一路保证低延迟,FFmpeg 转码一路补齐浏览器不支持的音频编码,go2rtc 会自动为每个客户端挑最合适的源:
streams: dahua: - rtsp://admin:pass@192.168.1.123/stream - ffmpeg:rtsp://admin:pass@192.168.1.123/stream#audio=opus码流过滤器。RTSP/HLS/MP4 出口没法像 WebRTC 那样自动探测设备能力,可以在链接上手动指定:rtsp://192.168.1.123:8554/camera1?mp4(录 MP4 用)、?video=h264&audio=aac。
硬件加速(可选)。Docker 用户直接换-hardware镜像并加--gpus all(N 卡)或保持privileged(Intel/树莓派),配置里给 ffmpeg 源加#hardware参数即可;镜像差异见 internal/ffmpeg/hardware/README.md。
监控与统计。流跑起来后,WebUI 的 Net 页能看到每个连接的 IP、协议、码率和流量,配合 API 还能导出 JSON/点图格式——排查"到底谁在拉流"非常有用:
再往后可以探索的方向:publish把任意流推到 Telegram/YouTube(internal/streams/README.md)、preload让慢启动摄像头开机即就绪、以及把 www/ 里的播放器 JS 嵌进自己的项目。
自检清单:画面出不来?按顺序勾一遍
遇到"没画面"时 90% 是下面这几项之一,从上到下勾:
- 进程活着?
docker logs go2rtc或终端输出里有正常启动日志 - 浏览器能打开
http://localhost:1984/?不能 → 1984 被防火墙拦了,或被api.listen收回到 127.0.0.1 - 摄像头 URL 本身能通?用
ffplay rtsp://...或设备厂商 App 单独验证,先排除摄像头问题 - 地址/账号/密码对吗?注意 URL 里特殊字符(如
#、?)需要转义 - 编码兼容?H265 在老浏览器/iPhone 上可能黑屏,试试给链接加
?video=h264或加一路ffmpeg:转码源(参考 README 的 Codecs 一节) - 外网看不到 WebRTC?8555 端口需要在路由器同时放行 TCP 和 UDP
- 日志级别调高:配置里加
log: {level: debug, streams: debug}看具体断在哪一环 - 音频没声音?PCMA/PCMU 是 256 级低质量编码,很多出口需要转成 AAC/OPUS 才能播
还查不出来,就把log.level: trace的输出贴给社区,基本都能定位。
延伸导航:项目内文档地图
| 想看什么 | 去哪里 |
|---|---|
| 全部模块与功能总表 | internal/README.md |
| 配置项完整参考(默认值、环境变量) | internal/app/README.md |
| HTTP / WebSocket API 说明 | internal/api/README.md |
| OpenAPI 描述文件 | website/api/openapi.yaml |
| WebUI 与自定义播放器 | www/README.md |
| FFmpeg 源与硬件加速 | internal/ffmpeg/README.md |
| 各私有协议(Tapo/Wyze/小米/Nest…)接入参数 | internal/webrtc/README.md、internal/tapo/README.md |
| 流推流、preload、发布 | internal/streams/README.md |
上手顺序建议:先用 5 分钟跑通看到画面 → 再花 10 分钟改好streams和安全设置 → 之后每遇到一个新摄像头/新需求,回到上表按需深入即可。
【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考