ZLMediaKit教程 - 开源流媒体服务器搭建与使用完整指南
ZLMediaKit是什么?
ZLMediaKit是一个基于C++11开发的高性能运营级流媒体服务框架。它支持多种主流流媒体协议,可以作为直播推流、视频监控、视频会议等应用的流媒体服务器使用。
核心特性
- 🚀 高性能 - 支持10W级别播放器,100Gb/s级别IO带宽
- 🔄 多协议支持 - RTSP/RTMP/HLS/HTTP-FLV/WebRTC等
- 🌟 跨平台 - 支持Linux/macOS/iOS/Android/Windows
- 🔒 安全可靠 - 支持推拉流鉴权、HTTPS加密
- 🎯 低延迟 - 500ms以内,最低可达100ms
- 🎥 编码支持 - H265/H264/AAC/G711/OPUS
支持的协议
主要协议支持
协议 | 推流 | 拉流 | 特点 |
---|---|---|---|
RTSP | ✓ | ✓ | 低延迟,支持TCP/UDP |
RTMP | ✓ | ✓ | 广泛使用,延迟较低 |
WebRTC | ✓ | ✓ | 超低延迟,支持P2P |
HLS | - | ✓ | 兼容性好,延迟较高 |
HTTP-FLV | - | ✓ | 兼容性好,延迟较低 |
SRT | ✓ | ✓ | 抗丢包,适合公网传输 |
RTP | ✓ | ✓ | 支持RTP 推流 |
快速开始
获取程序
ZLMediaKit提供多个平台的预编译版本,可以从以下地址获取:
提示:
- 如果需要使用最新版本,可以自行编译
- 编译方法请参考官方文档
下载汇总: https://github.com/ZLMediaKit/ZLMediaKit/issues/483
Windows版本
https://github.com/ZLMediaKit/ZLMediaKit/actions/runs/11970177032/artifacts/2223468517
Linux版本
https://github.com/ZLMediaKit/ZLMediaKit/actions/runs/11970177030/artifacts/2223503747
macOS版本
https://github.com/ZLMediaKit/ZLMediaKit/actions/runs/11970177053/artifacts/2223498187
播放URL规则
URL组成部分
以rtsp://somedomain.com:554/live/0?token=abcdefg&field=value
为例,该URL包含以下几个部分:
协议(scheam)
: rtsp协议,默认端口554虚拟主机(vhost)
: somedomain.com,可以是域名或IP服务端口号(port)
: 554,不指定则使用协议默认端口应用名(app)
: live流ID(streamid)
: 0参数(args)
: token=abcdefg&field=value
流媒体源类型
ZLMediaKit支持5种类型的流媒体源(MediaSource):
RtspMediaSource
: 支持rtsp播放/推流、webrtc播放/推流RtmpMediaSource
: 支持rtmp推流/播放、http-flv播放、ws-flv播放HlsMediaSource
: 支持hls播放TSMediaSource
: 支持http-ts播放、ws-ts播放FMP4MediaSource
: 支持http-fmp4播放、ws-fmp4播放
播放地址示例
假设有一个RTSP流媒体源,4元组为:
- 协议: rtsp
- 虚拟主机: somedomain.com
- 应用名: live
- 流ID: 0
则可用以下URL访问:
# RTSP播放
rtsp://somedomain.com/live/0
rtsps://somedomain.com/live/0
rtsp://127.0.0.1/live/0?vhost=somedomain.com
# RTMP播放
rtmp://somedomain.com/live/0
rtmps://somedomain.com/live/0
# HTTP-FLV播放
http://somedomain.com/live/0.live.flv
https://somedomain.com/live/0.live.flv
# WebSocket-FLV播放
ws://somedomain.com/live/0.live.flv
wss://somedomain.com/live/0.live.flv
# HLS播放
http://somedomain.com/live/0/hls.m3u8
https://somedomain.com/live/0/hls.m3u8
# HTTP-TS播放
http://somedomain.com/live/0.live.ts
https://somedomain.com/live/0.live.ts
# WebSocket-TS播放
ws://somedomain.com/live/0.live.ts
wss://somedomain.com/live/0.live.ts
# HTTP-FMP4播放
http://somedomain.com/live/0.live.mp4
https://somedomain.com/live/0.live.mp4
# WebSocket-FMP4播放
ws://somedomain.com/live/0.live.mp4
wss://somedomain.com/live/0.live.mp4
点播URL规则
ZLMediaKit支持MP4点播,默认应用名为record
:
# HTTP点播(推荐)
http://somedomain.com/record/video.mp4
# RTSP点播
rtsp://somedomain.com/record/video.mp4
# RTMP点播
rtmp://somedomain.com/record/video.mp4
# HTTP-FLV点播
http://somedomain.com/record/video.mp4.live.flv
# HTTP-TS点播
http://somedomain.com/record/video.mp4.live.ts
# HTTP-FMP4点播
http://somedomain.com/record/video.mp4.live.mp4
URL参数说明
- URL中问号后的字符串会被识别为参数
- 参数
vhost
为内置支持的虚拟主机参数 - URL参数可用于推流和播放鉴权
- 在触发hook api时会将参数提交给业务服务器
推流测试
1. RTSP推流
# H264编码推流
ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
# H265编码推流
ffmpeg -re -i test.mp4 -vcodec h265 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
2. RTMP推流
# H264推流
ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test
# OBS推流地址
rtmp://127.0.0.1/live/test
3. RTP推流 (支持RTP/UDP)
# h264推流
ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
# h265推流
ffmpeg -re -i "/path/to/test.mp4" -vcodec h265 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
4. SRT推流
# OBS推流
srt://192.168.1.105:9000?streamid=#!::r=live/test,m=publish
# FFmpeg推流
ffmpeg -re -stream_loop -1 -i test.ts -c:v copy -c:a copy -f mpegts srt://192.168.1.105:9000?streamid=#!::r=live/test,m=publish
拉流播放
RTSP拉流
ffplay rtsp://127.0.0.1/live/test
RTMP拉流
ffplay rtmp://127.0.0.1/live/test
SRT拉流
# FFplay拉流
ffplay -i srt://192.168.1.105:9000?streamid=#!::r=live/test
# VLC拉流
# 1. 设置串流输出->访问输出->SRT中的streamid为 #!::r=live/test
# 2. 填入地址 srt://192.168.1.105:9000
WebRTC拉流
WebRTC支持WHIP/WHEP标准,可以通过以下地址访问:
推流地址
https://zlmediakit.com/index/api/whip?app=live&stream=test
拉流地址
https://zlmediakit.com/index/api/whep?app=live&stream=test
进阶功能
1. 推流鉴权
通过配置文件和Web Hook实现推流鉴权:
{
"api": {
"secret": "035c73f7-bb6b-4889-a715-d9eb2d1925cc",
"hooks": [
"http://127.0.0.1:8080/index/hook"
]
}
}
2. 按需拉流
支持无人观看时自动关闭拉流,节省资源:
{
"general": {
"streamNoneReaderDelayMS": 20000
}
}
3. 集群部署
支持边缘集群模式部署,实现负载均衡:
{
"cluster": {
"enable": true,
"origin_url": "rtmp://master.com/live/stream_id"
}
}
容器化部署
ZLMediaKit提供了官方Docker镜像,可以快速部署服务:
# 拉取最新镜像
docker pull zlmediakit/zlmediakit:master
# 启动容器
docker run -id \
-p 1935:1935 \ # RTMP端口
-p 8080:80 \ # HTTP端口
-p 8443:443 \ # HTTPS端口
-p 8554:554 \ # RTSP端口
-p 10000:10000 \ # RTP端口
-p 10000:10000/udp \ # RTP UDP端口
-p 8000:8000/udp \ # RTSP UDP端口
-p 9000:9000/udp \ # SRT端口
zlmediakit/zlmediakit:master
默认端口说明
ZLMediaKit默认开放以下端口:
端口 | 协议 | 用途 |
---|---|---|
554 | TCP | RTSP推拉流 |
1935 | TCP | RTMP推拉流 |
80 | TCP | HTTP访问(WebAPI/HTTP-FLV/HLS) |
443 | TCP | HTTPS访问 |
8000 | UDP | RTSP UDP推拉流 |
9000 | UDP | SRT推拉流 |
10000 | TCP/UDP | RTP推拉流 |
提示:
- 使用容器时需要映射相应端口才能从外部访问
- 可以通过配置文件修改默认端口
- UDP端口建议开放,否则可能影响部分协议的使用
配置持久化
为了保持配置和数据的持久化,建议挂载以下目录:
docker run -id \
-v /your/config:/opt/media/conf \ # 配置文件目录
-v /your/logs:/opt/media/log \ # 日志目录
-v /your/media:/opt/media/www \ # 媒体文件目录
... # 其他端口映射
zlmediakit/zlmediakit:master