go2rtc:把任意摄像头变成低延迟视频流的终极工具,从 RTSP 到 WebRTC 一个配置搞定
go2rtc把任意摄像头变成低延迟视频流的终极工具从 RTSP 到 WebRTC 一个配置搞定【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtcgo2rtc 是一个零依赖的摄像机流媒体应用你把摄像头的 RTSP 地址、ONVIF 地址甚至文件路径丢给它一份 YAML 配置它就能同时输出 WebRTC、RTSP、HLS、MP4、MJPEG 等十几种协议的流且多数协议接近零延迟。适合家里装了几个摄像头、想让手机浏览器和监控软件都能低延迟看画面的你。家里有 3 个海康摄像头为什么你需要一个中间层先说两个真实场景。场景一你家装了 3 个海康摄像头厂商 App 只能一台手机一个账号地登录家人想在你家客厅电视上看还得再装个 App。你希望手机浏览器打开一个网页就能看延迟最好在 1 秒以内。场景二你用 Frigate 或 Home Assistant 做 AI 检测它们需要标准 RTSP 输入但你的摄像头 RTSP 实现有坑SDP 畸形、只支持 UDPffplay 都能卡住。go2rtc 就是站在摄像头和消费者之间的流媒体中间层它负责从摄像头把流拉下来包括各种私有协议如 Tapo、Wyze、小米再按需转成任何主流输出格式。你不用再关心每个客户端各自需要什么协议——一个源全协议输出。一张表看懂 go2rtc 能做什么能力说明什么时候用得到RTSP 输入 ONVIF 自动发现输入摄像头地址即可ONVIF 源还能自动探测 RTSP/快照链接不知道摄像头 RTSP 地址时私有云协议源Tapo、Wyze、小米、Ring、HomeKit 等 20 种摄像头没有标准 RTSP 时浏览器低延迟输出WebRTCUDP/TCP支持双向音频手机/电脑浏览器实时查看、对讲标准 RTSP 服务器把任意源变成干净的 RTSP喂给 Frigate、Home Assistant 录制HTTP-FLV / HLS / MP4多协议同时输出同一路流移动端 FLV 播放器、iPhone 上的 HLSFFmpeg 按需转码仅在客户端 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:password192.168.1.100/Streaming/Channels/101默认启动三个服务API 在1984端口、RTSP 在8554端口、WebRTC 用8555TCP/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 srchttp://localhost:1984/video-rtc.js/script script new VideoRTC({video: document.querySelector(video)}).play(camera1); /script不想写页面也可以直接开http://localhost:1984/webrtc.html?srccamera1。喂给 AI 检测/录制软件RTSPgo2rtc 把任意源重发为干净 RTSP加查询参数还能指定 codecffplay -fflags nobuffer -flags low_delay rtsp://localhost:8554/camera1 # 有画面且延迟约 200ms 即成功rtsp://localhost:8554/camera1?mp4会输出 H.264AAC 的 MP4 兼容组合专门给 Home Assistant / Frigate 录文件用。iPhone 或移动端播放器HLS# fMP4 格式 HLSH.264/H.265 均可 curl http://localhost:1984/api/stream.m3u8?srccamera1mp4 -o /dev/null -w %{http_code}\n # 返回 200 即成功把 URL 丢给任何 HLS 播放器逐帧快照 / 老式客户端MJPEGhttp://localhost:1984/mjpeg/camera1直接丢给img标签或任意 MJPEG 客户端。一句话记法要延迟选 WebRTC要兼容选 RTSP要 iPhone 选 HLS要省事选 MJPEG。进阶玩法转码、硬件加速与双向音频这一节按遇到什么问题 → 怎么配的方式讲。问题一浏览器不播 H.265。摄像头出 HEVC但 Firefox 和老 Safari 只吃 H.264。给流加一个 FFmpeg 转码源go2rtc 会在客户端不支持时自动切过去streams: cam: - rtsp://admin:password192.168.1.100/stream1 # 原流能直连就不转 - ffmpeg:rtsp://admin:password192.168.1.100/stream1#videoh264 # 备用转码源加#hardware参数可启用硬件加速QSV/VA-API/NVENC 按平台自动选模板在 FFmpeg 模块 里你还能在配置里覆盖h264模板参数。问题二画面方向不对 / 要缩分辨率#videoh264#rotate90#width1280即可转码时参数生效。问题三摄像头麦克风音频 codec 与浏览器不匹配。摄像头只出 AAC 而 WebRTC 要 OPUS加第二路转码音频源go2rtc 会做多源 codec 协商自动把视频和音频从不同源拼给浏览器streams: cam: - rtsp://admin:password192.168.1.100/stream1 - ffmpeg:rtsp://admin:password192.168.1.100/stream1#audioopus # 只转音频问题四想让摄像头说话双向音频。给 RTSP 源加#backchannel1streams: doorbell: rtsp://admin:password192.168.1.100/stream1#backchannel1浏览器端开webrtc.html?srcdoorbellmediavideoaudiomicrophone即可双向对讲麦克风需 HTTPS 页面。反过来把音乐/语音推到摄像头喇叭也行# 把本地音乐转码为 PCMA 后播到摄像头喇叭 curl -X POST http://localhost:1984/api/streams?dstdoorbellsrcffmpeg:http://example.com/song.mp3#audiopcma#inputfile问题五不知道摄像头的 RTSP 地址。用 ONVIF 源它会自动探测出 RTSP 和快照链接需在 ONVIF 模块 同一网段Docker 用户记得--network hoststreams: cam: onvif://admin:password192.168.1.100API 与二次开发把 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?srccam1 # 抓单帧快照二次开发有两类入口前端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 # 对外加密媒体HTTPSapi.tls_listen: :443tls_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: debuglog.file: go2rtc.log排障运行时健康检查用GET /api/streams200 即存活连接级别监控看 net 页或 WebSocket APIws 模块。外部 WebRTC 访问需在路由器同时放行 8555 的 TCP 和 UDP。踩坑与排查5 个高频问题现象 1浏览器里没画面终端日志报 codec 错误可能原因摄像头出 H.265浏览器不支持Firefox 全系、老 Chrome/Safari。解决给流加ffmpeg:...#videoh264第二源或先确认用 Chrome 136 / Safari 18已支持 WebRTC H.265。现象 2RTSP 客户端能连但延迟 2-3 秒可能原因客户端默认缓存。解决ffplay -fflags nobuffer -flags low_delay rtsp://localhost:8554/camera1或 VLC 把 Default Caching Level 调到最低。现象 3Docker 里 ONVIF 发现不到摄像头可能原因ONVIF 自动发现依赖同网段广播bridge 网络收不到。解决docker run --network host ...或直接用 WebUI add 页手动填 ONVIF 地址。现象 4转码流 CPU 飙高可能原因默认走软编 libx264。解决转码源加#hardware参数启用 QSV/VA-API/NVENC先在 WebUI add 页确认本机可用的硬件编码器顺带关掉不用的drawtext时间戳叠加它即使有硬编也吃 CPU。现象 5iPhone 上流不动可能原因Apple 设备不支持 HTTP 渐进式下载和 MSE老 iOSWebRTC 的 Safari 自动播放也有坑。解决给 iPhone 单独走?srccam1mp4的 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),仅供参考