一个进程搞定摄像头流协议转换: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),仅供参考