流媒体服务选型与部署:ZLMediaKit从安装到拉流转发实战
华天龙 IPC 的 RTSP 流有了,但你要把画面同步给 Web 端、手机 App、甚至微信小程序------一个 RTSP 地址是不够的。需要一台流媒体服务器把 RTSP 收进来,转成 HLS/HTTP-FLV/WebRTC 分发出去。这一篇聚焦几种主流流媒体服务器的选型对比,以及 ZLMediaKit 的安装和基本使用。
大家好,我是黒漂技术佬。
做无人售货柜的时候,我需要在用户扫码开门后,运维人员在后台实时看到柜内摄像头画面,确认交易异常时可以人工介入。这要求我能从 IPC 拉 RTSP 流进来,转成 Web 端直接能播的格式。RTMP/FLV/HLS/WebRTC,到底用哪个?服务器选哪个?这一篇把答案摆到台面上。
一、流媒体服务器能干什么?
一句话:多协议接入、多协议分发。 它收一种格式的流,吐多种格式的流出去。
典型工作流:
IPC (RTSP) --拉流--> 流媒体服务器 --转协议--> 浏览器 (HTTP-FLV/WebRTC)
手机 App (HLS)
小程序 (WebRTC/HLS)
录像文件 (MP4)
核心能力:
- 协议转换:RTSP 进 → RTMP/HTTP-FLV/HLS/WebRTC 出
- 录像存储:一边直播一边把流存成 MP4
- 拉流转发:不需要摄像头主动推流,服务器主动去拉
- GB28181 对接:部分服务器支持 GB28181 设备注册和信令
二、主流流媒体服务器对比
| 服务器 | 语言 | 支持协议 | GB28181 | 性能 | 特点 |
|---|---|---|---|---|---|
| ZLMediaKit | C++ | RTSP/RTMP/HLS/HTTP-FLV/WebRTC/SRT/RTC | ✅ | 极高 | 国产开源,全面且高性能 |
| SRS | C++ | RTMP/HLS/HTTP-FLV/WebRTC/SRT | ❌ | 极高 | 直播行业标准,社区活跃 |
| nginx-rtmp | C | RTMP/HLS | ❌ | 中等 | 上古神器,仅推荐学习用 |
| MediaMTX | Go | RTSP/RTMP/HLS/WebRTC | ❌ | 中高 | 轻量,零配置,适合开发 |
| Janus | C | WebRTC(SFU) | ❌ | 高 | WebRTC 专用网关 |
我的选型建议
| 场景 | 推荐 |
|---|---|
| 纯 IPC 监控,需要 RTSP 拉流转发 | ZLMediaKit(支持 GB28181) |
| 只做直播推流(OBS 推 RTMP),不用 RTSP | SRS |
| 快速原型验证,一行命令起服务 | MediaMTX |
| 低延迟视频通话 / WebRTC 实时通信 | Janus + ZLMediaKit |
无人售货柜场景符合第一条:IPC 出 RTSP → 拉流转 Web 端播放 → 未来可能接 GB28181。所以选 ZLMediaKit。
三、ZLMediaKit 快速部署(Docker)
最省事的方式:
shell
# 创建配置目录
mkdir -p /opt/zlmediakit/config
# 拉镜像并启动
docker run -d --name zlmediakit \
-p 554:554 \
-p 1935:1935 \
-p 8080:80 \
-p 8443:443 \
-p 10000:10000/udp \
-v /opt/zlmediakit/config:/opt/media/bin/config \
panjjo/zlmediakit:latest
端口说明:
| 端口 | 协议 | 用途 |
|---|---|---|
| 554 | TCP | RTSP 服务端口 |
| 1935 | TCP | RTMP 服务端口 |
| 80 | TCP | HTTP-FLV / HLS / WS-FLV |
| 443 | TCP | HTTPS-FLV / WebRTC |
| 10000 | UDP | WebRTC 媒体传输 |
四、拉 RTSP 流转发:动态添加流
ZLMediaKit 支持两种方式添加 RTSP 流源:
方式一:RESTful API(推荐,程序对接)
shell
# 添加一个 RTSP 拉流代理
curl -X POST http://localhost:80/index/api/addStreamProxy \
-d "secret=your_secret&vhost=__defaultVhost__&app=live&stream=camera01&url=rtsp://admin:123456@192.168.31.188:554/stream0"
参数说明:
vhost:虚拟主机,默认__defaultVhost__app:应用名,随便起,比如livestream:流名,比如camera01url:源 RTSP 地址
添加成功后,ZLMediaKit 会自动去拉流,然后你就能用多种协议访问这路流:
| 协议 | 播放地址 |
|---|---|
| RTMP | rtmp://服务器IP:1935/live/camera01 |
| RTSP | rtsp://服务器IP:554/live/camera01 |
| HTTP-FLV | http://服务器IP:80/live/camera01.live.flv |
| HLS | http://服务器IP:80/live/camera01/hls.m3u8 |
| WebRTC | http://服务器IP:80/index/api/webrtc?app=live&stream=camera01&type=play |
方式二:配置文件(静态场景)
编辑 config.ini:
ini
[rtsp_proxy]
# 格式:stream_name=rtsp_url
camera01=rtsp://admin:123456@192.168.31.188:554/stream0
camera02=rtsp://admin:123456@192.168.31.189:554/stream0
重启 ZLMediaKit 后自动拉流,适合固定摄像头数量的场景。
五、Web 端播放实战
有了 ZLMediaKit 转发的 HTTP-FLV 或 WebRTC 地址,Web 端怎么播?
HTTP-FLV 播放(flv.js)
html
<video id="video" controls></video>
<script src="flv.min.js"></script>
<script>
if (flvjs.isSupported()) {
var player = flvjs.createPlayer({
type: 'flv',
url: 'http://192.168.31.100:80/live/camera01.live.flv'
});
player.attachMediaElement(document.getElementById('video'));
player.load();
player.play();
}
</script>
WebRTC 播放
ZLMediaKit 内置 WebRTC 能力,直接用浏览器访问:
http://192.168.31.100:80/index/api/webrtc?app=live&stream=camera01&type=play
返回一个 SDP,浏览器自动建立 WebRTC 连接。延迟 < 1 秒,适合对实时性要求高的场景。
六、性能参考
ZLMediaKit 在普通 x86 服务器上的表现:
| 并发拉流数 | CPU(4 核) | 内存 | 说明 |
|---|---|---|---|
| 10 路 | 5% | 200MB | RTSP 拉 + RTMP/FLV 转 |
| 50 路 | 15% | 400MB | 不加转码 |
| 100 路 | 25% | 600MB | 纯转发不转码 |
关键原则:只要不重新编码,流媒体服务器就是纯网络转发,CPU 消耗极低。 一旦你加 -vcodec libx264 之类的转码参数,单路 1080P 就能吃掉一个大核。所以 IPC 端统一 H.265 或 H.264,服务器端只转封装不转编码。
本篇简结
- 流媒体服务器解决「RTSP 摄像头 → Web/App 多端播放」的协议转换问题。
- ZLMediaKit 是目前国产开源中最全面的选择,支持 RTSP/RTMP/HLS/HTTP-FLV/WebRTC/GB28181。
- 用 Docker 一行命令部署,RESTful API 动态添加拉流代理。
- Web 端播 HTTP-FLV(flv.js)或 WebRTC(免插件)。
- 转发不转码,CPU 消耗极低;千万别在服务器上做视频编码。
我是黒漂技术佬,下一篇文章是本次系列的终章------把 IPC、流媒体服务器、STM32 电磁锁、MQTT 全部串联起来,走一遍无人售货柜的完整开门→拍照→扣款流程。