news 2026/9/12 11:24:13

go2rtc 完整指南:多协议摄像头流统一输出 WebRTC,一条 Docker 命令跑起来

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go2rtc 完整指南:多协议摄像头流统一输出 WebRTC,一条 Docker 命令跑起来

go2rtc 完整指南:多协议摄像头流统一输出 WebRTC,一条 Docker 命令跑起来

【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc

门口铃是 Tapo 私有协议,客厅摄像头走 RTSP,家里还有台 HomeKit 摄像头——三部手机要开三个 App 才能看全。go2rtc 把这些来源统一收进一个流媒体服务器,再以 WebRTC、RTSP、HLS 等形式分发给浏览器、Home Assistant 或 NVR。

一句话定位:零依赖的单一流媒体服务器

  • 一个用 Go 写成的单文件应用,无任何运行时依赖,Windows、macOS、Linux、FreeBSD 都能跑,树莓派级别的设备也带得动。
  • 适合需要把多品牌摄像头统一接进浏览器、Home Assistant、Frigate 的人。
  • 与大多数协议网关的本质区别:它不是简单转发。go2rtc 会把"客户端能解的编解码器"和"源里携带的编解码器"自动匹配,只有匹配不上时才拉起 FFmpeg 转码,且只转码需要的轨道。

工作原理一句话:在配置里给每路流定义一个或多个来源,有人播放时它拉流,再从 RTSP 服务器、WebRTC 服务器、HTTP 端点等出口按需分发。

最快部署:一条 Docker 命令

官方推荐 Docker 部署,镜像预装 FFmpeg,覆盖 amd64、386、arm/v6 到 arm64 各架构:

docker run -d \ --name go2rtc \ --network host \ --privileged \ --restart unless-stopped \ -v ~/go2rtc:/config \ alexxit/go2rtc

--network host对 WebRTC 和 UDP 摄像头是必需的;--privileged只在需要 FFmpeg 硬件转码时才用。启动后打开http://localhost:1984就是 Web 管理界面。其他途径一句话带过:也可从 release 下载对应平台的二进制直接运行(Linux/macOS 记得chmod +x),Home Assistant 有官方 add-on;想改源码就git clone https://gitcode.com/GitHub_Trending/go/go2rtcgo build

最小可运行配置:一行 streams 就够

streams: front_door: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0
  • streams:下面每一项就是"流名: 来源",流名会出现在 WebUI 和所有输出 URL 里;
  • 值就是视频源,这里是海康/大华风格的 RTSP 地址;
  • 不写其他任何配置时,默认 api 监听1984(WebUI 和 HTTP API)、RTSP 服务器监听8554、WebRTC 使用8555(TCP/UDP)。

也就是说这一行写完,VLC 或 FFmpeg 就能拉rtsp://localhost:8554/front_door,浏览器能打开 WebUI 播放。密码不想明文写,可用环境变量替换,如${CAMERA_PASSWORD}。配置随时能在 WebUI 里直接编辑,自带语法高亮和 schema 校验:

从输入到输出:流怎么进、又怎么出

结论先行:所有流都是"来源进、协议出",输入和输出互相独立。

数据源怎么接进来(写在 streams 的值里):

来源类型写法示例说明
RTSP / RTSPSrtsp://rtsps://绝大多数摄像头的主协议
RTMPrtmp://192.168.1.10/live/cam部分摄像头(如 Reolink)
ONVIFonvif://user:pass@ip自动查询出 RTSP 地址
MJPEG / HTTPhttp://ip/snapshot传统快照流
WebRTCwebrtc:ws://…、WHEP3D 打印机、Kinesis 等
私有协议tapo:wyze:xiaomi:homekit:Tapo/Kasa、Wyze、小米、Tuya、Ring、Roborock、Doorbird、Nest 等直接可写
本地设备v4l2:alsa:USB 摄像头、Linux 音频采集
FFmpeg / execffmpeg:任意地址#参数文件、动态 URL、USB 设备兜底方案

能以什么形式输出到哪里

  • WebRTC 服务器 :8555—— 浏览器延迟最低,支持双向音频;
  • RTSP 服务器 :8554—— 供 NVR、Frigate、Home Assistant 拉取;
  • HTTP 端点 :1984——stream.mp4(MSE/渐进式)、stream.m3u8(HLS,iPhone 唯一选择)、stream.flvstream.mjpgframe.jpeg抓拍;
  • ONVIF 服务器、HomeKit(接入苹果家庭)、WebTorrent、JPEG 快照;
  • Ingest 反向推流—— 外部程序可把 rtmp/rtsp/webrtc/mjpeg 等流推进 go2rtc。

一个细节值得知道:WebRTC 和 MSE 会自动探测浏览器支持的编码;RTSP、HLS 做不到,需要在 URL 上加过滤参数,如rtsp://localhost:8554/front_door?video=h264&audio=aac,或加?mp4输出 H264/H265+AAC 的 MP4 兼容流(适合录像)。每条连接的 IP、协议、字节数都能在 WebUI 的实时连接图上看到:

三个最实用的配置组合

1. 摄像头音频编码和浏览器不匹配,加一路 FFmpeg 源

比如摄像头音频是 AAC,浏览器 WebRTC 只收 OPUS/PCMU/PCMA,加上转码源后 go2rtc 会为每个客户端在多路来源里自动挑兼容轨道:

streams: doorbell: - 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

这种"多来源多编码协商"是它区别于转发器的核心能力。

2. NAS 上做硬件加速转码:给 ffmpeg 源追加#video=h264#hardware即可走 GPU(Intel iGPU、树莓派用标准镜像,NVIDIA/AMD 换latest-hardware镜像,Docker 需--privileged)。硬件加速默认关闭,不显式写#hardware不会生效。效果:CPU 占用明显下降,输出统一为到处可播的 H264。

3. 推流到 Telegram / YouTube:在配置里声明 publish 目标,要求流为 H264+AAC(通常先经ffmpeg:…#video=h264#audio=aac转码):

publish: mystream: rtmps://xxx-x.rtmp.t.me/s/你的推流密钥

顺带一提,支持双向音频的摄像头还能通过 API 反向播放本地音频文件或电台流,详见 internal/streams/README.md。

实用要点:调优、安全与弱设备

  1. 延迟:RTSP 播放卡顿大半是播放器缓冲造成的,用ffplay -fflags nobuffer -flags low_delay "rtsp://localhost:8554/front_door"验证服务器端延迟(适用于支持该参数的客户端)。
  2. 安全:默认 1984、8554 端口对局域网无鉴权开放,内网有不可信设备时,把apirtsplisten改成127.0.0.1:端口,WebUI 交给 Nginx 等反向代理加认证;WebRTC 的 8555 保持外可达但媒体是加密的。
  3. 硬件加速只在视频转码时才有意义:只转发(无 ffmpeg 源,或#video=copy)时开启反而徒增风险,按需加#hardware
  4. 弱设备(树莓派、低端 NAS):预览和 AI 检测源用子码流(subtype=1),录像用主码流;同时处理的流数量保持克制。
  5. 排障log:下可按模块设级别,如rtsp: trace,单独追踪一个模块而不刷屏。

出问题时的速查表

现象可能原因处理方法
浏览器播放提示编码不兼容源是 H265,客户端不支持换 H264 子码流,或加#video=h264转码源
局域网正常、外网 WebRTC 连不上路由器没放行 8555开放 8555 的 TCP 和 UDP
双向音频打不开麦克风浏览器仅允许 HTTPS 站点取麦克风给 WebUI/播放页加 TLS 反向代理
画面偶发丢包、卡顿摄像头 RTSP 实现质量差改用ffmpeg:源接入,或换子码流
启动后摄像头迟迟出不了流冷启动连接慢被超时踢掉preload:让 go2rtc 启动时预拉流

适合谁,以及第一步

家里有多品牌摄像头、又不想为每装一台就多开一个 App 的人,它都值得装一个。建议按顺序做三件事:

  1. 用上面的 Docker 命令部署,把一台 RTSP 摄像头写进go2rtc.yaml
  2. 打开http://localhost:1984,确认 WebRTC 播放正常;
  3. 遇到播不出来的摄像头,先查 WebUI 信息页的编码列表,再对照速查表处理。

【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 11:23:59

TCP/IP网络协议栈与Linux系统编程实战

1. 网络通信基础模型解析 现代计算机网络的基石是分层模型架构,最经典的当属OSI七层模型和TCP/IP四层模型。作为一名长期奋战在系统编程一线的开发者,我经常需要在这两种模型之间切换思考。OSI模型像教科书般严谨,而TCP/IP模型则更贴近实际工…

作者头像 李华
网站建设 2026/9/12 11:23:21

LPC2214裸机例程:寄存器级嵌入式开发入门锚点

简介:本资源是面向嵌入式初学者与LPC2214单片机开发者的软件参考设计合集,涵盖ADC、GPIO、UART、I2C、SPI、PWM、RTC、WDT、VIC、EMC等30类核心外设的基础驱动例程,适用于教学实验、课程设计及入门级项目开发。压缩包共903个文件,…

作者头像 李华
网站建设 2026/9/12 11:21:53

科研绘图利器:矢量图形库快速入门指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 11:21:43

基于深度学习的垃圾分类系统设计与工程实践

1. 项目背景与核心价值去年参与某智慧社区项目时,物业经理向我吐槽:"现在每天处理居民投诉最多的就是垃圾分类错误,保洁员复查工作量太大"。这促使我开始思考如何用技术手段解决这个问题。经过三个月的开发迭代,我们实现…

作者头像 李华
网站建设 2026/9/12 11:21:01

Linux调度器与进程切换原理及性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华