news 2026/9/12 7:45:43

一个进程搞定摄像头流协议转换:go2rtc 多设备统一推流实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个进程搞定摄像头流协议转换:go2rtc 多设备统一推流实战

一个进程搞定摄像头流协议转换:go2rtc 多设备统一推流实战

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

客厅一台 RTSP 摄像头、门口一个云门铃、车库一个 MJPEG 接口,看一遍全貌要在三个 App 之间来回切换。go2rtc 是一个用 Go 编写的零依赖流媒体应用,它在一个进程里完成摄像头协议转换:把各种来源接进来,再以 WebRTC、RTSP、HLS 等低延迟格式输出,让你在浏览器和手机上统一观看。

🧭 一图看懂:多源进,多端出

这张架构图就是它的工作方式:左侧输入端可以接几十种来源——RTSP/ONVIF、RTMP、HTTP-FLV/MJPEG/HLS、Apple HomeKit、TP-Link Tapo、Google Nest、GoPro、USB 采集设备等;中间是 go2rtc 本体,负责轨道混流、编解码器匹配,必要时才调用 FFmpeg 转码;右侧输出端按各端能播的格式分发——WebRTC、RTSP、MSE/MP4、HLS、MJPEG、HomeKit、RTMP。另外还有一条双向音频支路,可以把你的声音推回门铃和摄像头。

⚡ 3分钟启动 go2rtc

方式一:Docker 一行命令(推荐)

官方镜像alexxit/go2rtc已内置 FFmpeg 和 Python,支持 amd64、arm64 等多种架构。WebRTC 需要 8555 端口的 TCP/UDP,用 host 网络模式最省事:

docker run -d --name go2rtc --network host --restart unless-stopped \ -v $(pwd)/go2rtc.yaml:/config/go2rtc.yaml alexxit/go2rtc

方式二:二进制直接运行

从官方 Release 页下载对应平台的二进制文件(如go2rtc_linux_amd64),赋予执行权限后直接运行,不需要安装任何系统依赖:

chmod +x go2rtc_linux_amd64 ./go2rtc_linux_amd64

两种方式启动后,打开http://localhost:1984/即可看到 WebUI 管理界面,配置里添加流并保存后能直接在页面播放。默认端口为:API/WebUI 1984、RTSP 8554、WebRTC 8555。

🎥 场景实战:四个高频需求

浏览器统一查看多路摄像头

把所有摄像头地址写进go2rtc.yaml,一行一个:

streams: living-room: rtsp://admin:password@192.168.1.100:554/stream1 doorbell: rtsp://admin:password@192.168.1.101:554/stream1 garage: http://192.168.1.102:8080/mjpg/video.mjpg

打开http://localhost:1984/的 index 页,每路流都会变成可播放的卡片。go2rtc 会自动探测你的浏览器支持哪些编解码器,并优先选择延迟最低的 WebRTC 通道,手机和电脑都不需要装任何插件。配置也可以在 WebUI 的 config 页直接编辑,带语法高亮和错误提示:

接入 Home Assistant 或 Frigate

如果你用 Home Assistant(2024.11+)或 Frigate(0.12+)做录像和 AI 检测,可以把录像源直接指向 go2rtc 的 RTSP 输出,并在 URL 上加?mp4过滤参数,它会挑选 H264/AAC 这类 MP4 兼容的编码:

rtsp://192.168.1.100:8554/living-room?mp4

效果是播放器拿到的就是标准 MP4 兼容流,录像文件随处可放,不用再逐一适配每台摄像头。

把摄像头推到直播平台

想做临时直播(YouTube、Telegram 等)时,用内置的 publish 功能经 RTMP/RTMPS 推流。要求视频为 H264、音频为 AAC,且 YouTube 不接受无音频的视频:

publish: living-room: - rtmp://live.example.com/app/your-stream-key streams: living-room: rtsp://admin:password@192.168.1.100:554/stream1

保存配置后推流即生效,不用再挂一个常驻的转码推流服务。

在浏览器里和门铃说话

对带喇叭和麦克风的设备,go2rtc 支持双向音频,覆盖 RTSP(ONVIF T)、Tapo、Ring、Doorbird、Tuya、Wyze、小米等大量品牌。把这类设备配成一路流后,在 WebUI 的 WebRTC 播放页就能看到麦克风按钮,按住即可讲话。注意浏览器只对 HTTPS 页面开放麦克风,外网访问时需先套一层带 HTTPS 的反向代理;本机 127.0.0.1 访问一般不受此限制。

⚖️ 对比与选型:go2rtc 替代的是什么

对比项go2rtc传统多软件方案
协议覆盖数十种输入/输出协议 + 多品牌私有协议通常 3-5 种
部署方式单二进制或 Docker 镜像,零系统依赖多个服务 + 一堆依赖
延迟WebRTC 通道接近实时中转/转码链路常超 200ms
转码按需拉起 FFmpeg,不需要时不占资源常驻转码服务
硬件要求树莓派即可运行通常需要桌面级配置

如果你的摄像头全部同品牌同协议、且现有观看方式已经够用,可以不必换;但一旦跨品牌、跨协议,或者要同时接浏览器和智能家居,统一协议转换层的收益就会很明显。

🩺 避坑速查:常见问题与解法

现象解法
观看延迟高改用 WebRTC 通道(延迟最低);RTSP 客户端测试用ffplay -fflags nobuffer -flags low_delay rtsp://localhost:8554/流名判断是否为客户端缓存
个别摄像头放不出来在 WebUI 查看该流实际编码;浏览器放不了就加?video=h264&audio=aac过滤,或用ffmpeg:...#video=h264源转码
内存/CPU 偏高减少同时开启的流数量;确需转码时加#hardware启用硬件加速(设备需有对应加速能力)
浏览器双向音频不可用麦克风仅对 HTTPS 页面开放;外网访问前先配好带证书的反向代理

排查问题时,WebUI 的 net 页可以看到每路流实时的连接、流量和包统计,先看这里判断问题出在哪一环:

📌 结语

go2rtc 把"一台摄像头一个 App"变成"一个进程接所有摄像头":家里只要有两台以上不同协议的摄像头,就值得花十分钟把第一路流跑起来。更多细节可查阅 README.md 与 internal/streams/README.md。

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

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

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

Java循环高级技巧与性能优化实战

1. Java循环高级综合练习概述作为一名Java开发者,掌握循环结构是基本功中的基本功。但很多初学者在学完基础语法后,往往陷入"知道for/while怎么用,但遇到实际问题还是无从下手"的困境。今天我们就来通过一系列精心设计的综合练习&a…

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

基于Muse Spark 1.3构建个人智能体助手:从工具调用到任务闭环

我最早注意到 Muse,是在一个智能体技术社群里看到有人贴了一段演示视频:对着手机说了一句"帮我整理一下这周的项目进度,顺便把风险点列出来",屏幕上就自动生成了结构化报告,还主动调出了三个相关文档做了摘要…

作者头像 李华
网站建设 2026/9/12 7:41:06

MATLAB实现通信信号时频分析与RML2016a数据集对比

/* 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 7:38:41

COMSOL相场法在水力压裂模拟中的工程实践

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

作者头像 李华