☰
go2rtc:把任意摄像头变成低延迟视频流的终极工具,从 RTSP 到 WebRTC 一个配置搞定
2026/10/9 6:48:25 网站建设 项目流程

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.100

API 与二次开发:把 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询