流媒体服务选型与部署:ZLMediaKit从安装到拉流转发实战

流媒体服务选型与部署: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:应用名,随便起,比如 live
  • stream:流名,比如 camera01
  • url:源 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 全部串联起来,走一遍无人售货柜的完整开门→拍照→扣款流程。