安防、直播、视频会议这些"实时音视频"场景,传统方案是 RTSP 摄像头 + 专有协议 + 客户端 SDK,部署和对接成本都很高。WebRTC 让浏览器"原生支持"实时音视频,但 RTSP 摄像头、监控厂商 NVR 不会自己讲 WebRTC——需要在中间架一座桥:流媒体服务器(ZLMediaKit / MediaMTX)、媒体代理网关(go2rtc)、WebRTC 网关(webrtc-streamer)。这篇文章把"摄像头推到 Web 浏览器"这条链路上常用的几款开源工具讲清楚。
阅读对象:要在 Web 端展示 RTSP/海康/大华摄像头画面的开发者、做直播点播的流媒体工程师
覆盖范围:ZLMediaKit 全协议流媒体服务器、MediaMTX、go2rtc 媒体代理、webrtc-streamer + coturn 部署、推拉流命令、浏览器播放
一、链路与角色
一条完整的"RTSP 摄像头 → 浏览器"链路涉及多个角色:
| |
关键协议:
- RTSP(Real Time Streaming Protocol):监控摄像头、NVR 的"母语",TCP/UDP 都有
- RTMP(Real-Time Messaging Protocol):直播"老炮",Adobe 推的,基于 TCP
- HLS(HTTP Live Streaming):苹果推的,基于 HTTP 切片,延迟 5-30s
- FLV:B 站流过来的,HTTP 渐进式下载
- WebRTC:浏览器原生,延迟 < 1s
- SRT:安全可靠传输,UDP 上的"准 TCP"
二、ZLMediaKit:全能流媒体服务器
ZLMediaKit 是国内开源的"协议转换器"——一个进程能同时讲 RTSP/RTMP/HLS/FLV/WebRTC/SRT,几乎所有"摄像头转 Web 播放"的方案都用它做中转。
2.1 编译安装(Linux)
| |
2.2 端口清单
| 名称 | 端口 | 协议 | 用途 |
|---|---|---|---|
| HTTP | 80, 443 | TCP | Web 服务、API |
| RTMP | 1935 | TCP | 推流 |
| RTP_PROXY | 10000 | TCP/UDP | RTSP 推流 |
| RTC (WebRTC) | 8000 | TCP/UDP | WebRTC 推拉流 |
| SRT | 9000 | UDP | SRT 推流 |
| RTSP | 554 | TCP | RTSP 服务 |
2.3 容器化部署(推荐)
| |
最常用的启动(带 RTC + 端口映射 + 配置持久化):
| |
或者显式端口映射:
| |
2.4 核心配置
config.ini(摘录关键段):
| |
secret 必须改:默认 secret 是公开的,生产环境必须改成 32+ 随机字符串,否则别人能直接调 API 拉你的流。
2.5 推流与拉流
FFmpeg 推流:
| |
ffplay 拉流:
| |
WebRTC 拉流(浏览器):
| |
2.6 添加 RTSP 摄像头
用 ZLMediaKit 的 addStreamProxy API 把远程 RTSP 摄像头拉过来转协议:
| |
返回:
| |
得到多种播放地址:
| 协议 | 地址 |
|---|---|
| FLV | http://{{ZLM_HOST}}:80/live/test.live.flv |
| HLS | http://{{ZLM_HOST}}:80/live/test/hls.m3u8 |
| WebRTC | http://{{ZLM_HOST}}:80/index/api/webrtc?app=live&stream=test&type=play |
删除代理:
| |
三、MediaMTX:Go 写的极简流媒体服务器
MediaMTX(原 rtsp-simple-server)是 BluEnviron 出品的"零配置"流媒体服务器,Go 单文件、跨平台、配置项极少,适合"快速搭一个 RTSP/RTMP/HLS/WebRTC 都能讲"的服务。
- 官网:https://github.com/bluenviron/mediamtx
- 配置文件:
mediamtx.yml - 启动:
./mediamtx或docker run --net=host bluenviron/mediamtx:latest
vs ZLMediaKit:MediaMTX 配置简单、Go 生态友好、集群模式原生;ZLMediaKit 协议支持更全(C++ 实现,定制能力更强)、国内社区活跃、有中文文档。
四、go2rtc:媒体代理网关
go2rtc 解决"RTSP 摄像头接入多套系统"的问题——一次拉流,多协议分发,支持 RTSP/RTMP/HLS/WebRTC/MJPEG/HomeKit/ONVIF。
4.1 部署
| |
访问 http://{{HOST}}:1984/ 看 Web UI。
4.2 添加 RTSP 流
/home/docker/go2rtc/go2rtc.yaml:
| |
4.3 鉴权(生产环境)
| |
4.4 验证
| |
go2rtc 优势:用 WebRTC 时延迟能压到 0.4s 左右,远低于 HLS 的 5-30s。比 ZLMediaKit 启动更快,配置更少。
五、webrtc-streamer + coturn:浏览器 WebRTC 网关
webrtc-streamer 是 mpromonet 写的"小 HTTP server + WebRTC 客户端",核心功能是把 RTSP 流通过 WebRTC 推给浏览器。
5.1 STUN/TURN 服务器(coturn)
WebRTC 在 NAT 环境下需要 STUN/TURN 中继。coturn 是开源的 TURN/STUN 服务器:
| |
5.2 webrtc-streamer 部署
| |
必须加
-o参数:使用空编解码器(保持帧编码),不转码,否则预览几路 CPU 就 100%。
5.3 公网部署架构
| |
5.4 浏览器播放
修改 webrtcconfig.js:
| |
打开 webrtcstreamer.html,几秒内浏览器就能看到摄像头画面。
5.5 关键 API
| API | 用途 |
|---|---|
/api/help | API 列表 |
/api/getPeerConnectionList | 当前活跃的 WebRTC 连接(排障必看) |
/api/getStreamList | 正在拉的 RTSP 流 |
/api/whep | WHEP 协议接入(WebRTC-HTTP Egress Protocol) |
六、踩坑清单
- 必须加
-o参数——webrtc-streamer 不加-o启动,CPU 100% 飙满 - H265 不支持——webrtc-streamer 只支持 H264 视频码流,H265 要在摄像头侧或 ZLMediaKit 转码
- WebRTC 401 鉴权失败——前端
webrtcconfig.js的 server URL 配错,或者 backendAuthorization没传对 - STUN/TURN 端口未映射——3478 TCP/UDP 都要在公网开放,否则 WebRTC 建联失败
- ZLMediaKit
secret没改——默认 secret 是公开的,别人能直接拉你的流 - Nginx 反代 WebRTC——必须带
Upgrade/Connection: upgrade头,否则 WebSocket 建联失败 - RTSP over TCP——内网穿透时 UDP 经常被丢,强制
rtsp_transport=tcp让 ffplay/webrtc-streamer 用 TCP 拉流
七、2024+ 视角补充
本文写于 2025-01,2025-2026 期间流媒体生态关键演进:
- ZLMediaKit 持续活跃:2024-2025 累计 100+ commits,WebRTC WHIP/WHEP 标准协议(vs 老的自研协议)、H265/WebCodecs 浏览器原生、SRT 推流成熟
- MediaMTX(原 rtsp-simple-server)1.10+:RTSP / RTMP / HLS / WebRTC / SRT / RTSPS 全部支持;Pion WebRTC(Go 实现)性能优化;API v3 替代 v2
- go2rtc 1.9+:FFmpeg 7.0 兼容、H265 浏览器播放(基于 WebCodecs)、ONVIF 探测内置
- webrtc-streamer 0.8.x 维护模式:社区转向 Pion / LiveKit 体系
- LiveKit 1.8+(2024-2026):云原生 SFU(Go + Rust),K8s 部署友好,WebRTC + SIP 网关——全平台视频会议 / 直播一体化新选择
- mediasoup 3.x:Node.js SFU 库,低延迟直播 / 互动直播首选
- Janus 1.3+:老牌 WebRTC Gateway,SIP / RTSP / WebRTC 三栖,2024 仍稳定
- 云方案:声网 Agora / 腾讯云 TRTC / 阿里云 RTC 2024+ 仍是商业首选
实战建议(2025-2026 视角):
- RTSP 摄像头 → Web → ZLMediaKit + go2rtc 组合仍是开源首选
- 互动直播 / 会议 → LiveKit(云原生 SFU)崛起,vs mediasoup 部署更简单
- 超低延迟(< 500ms)→ WebRTC + LiveKit / mediasoup
- H265 + 浏览器 → 必须 WebCodecs(2024+ Chrome / Edge / Safari 支持)
- 商业 / 大规模 → 声网 / 腾讯 TRTC 仍是最省心选择
八、参考资料
- ZLMediaKit:https://github.com/ZLMediaKit/ZLMediaKit
- MediaMTX:https://github.com/bluenviron/mediamtx
- go2rtc:https://github.com/AlexxIT/go2rtc
- webrtc-streamer:https://github.com/mpromonet/webrtc-streamer
- coturn:https://github.com/coturn/coturn
- WebRTC samples:https://webrtc.github.io/samples/
- LiveKit:https://livekit.io
- mediasoup:https://mediasoup.org
下一步
- 做安防/摄像头项目?→ WVP-Pro 国标视频流 一文,GB28181 + ZLMediaKit 完整方案
- 想做监控告警?→ Prometheus 监控告警体系 一文
- 一站式轻量 PaaS?→ Erda 云原生 PaaS 一文
