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/UDPRTMP✓✓广泛使用,延迟较低WebRTC✓✓超低延迟,支持P2PHLS-✓兼容性好,延迟较高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默认开放以下端口:

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

提示:

使用容器时需要映射相应端口才能从外部访问

可以通过配置文件修改默认端口

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