Tech Explorer Logo

ZLMediaKit教程 - 开源流媒体服务器搭建与使用完整指南

7 min read
Cover image for 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提供多个平台的预编译版本,可以从以下地址获取:

提示:

  1. 如果需要使用最新版本,可以自行编译
  2. 编译方法请参考官方文档

下载汇总: 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默认开放以下端口:

端口协议用途
554TCPRTSP推拉流
1935TCPRTMP推拉流
80TCPHTTP访问(WebAPI/HTTP-FLV/HLS)
443TCPHTTPS访问
8000UDPRTSP UDP推拉流
9000UDPSRT推拉流
10000TCP/UDPRTP推拉流

提示:

  1. 使用容器时需要映射相应端口才能从外部访问
  2. 可以通过配置文件修改默认端口
  3. 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