前言
ZLMediaKit 是一个基于C++11的高性能运营级流媒体服务框架。
项目地址:GitHub - ZLMediaKit/ZLMediaKit
使用教程
本教程为个人用于项目实践操作流程记录,教程仅完成项目基础运行。教程内容以Ubuntu系统为例,其他系统可参考官方文档。
一、安装、编译、运行(Ubuntu)
详细步骤参考官方文档:快速开始 · ZLMediaKit/ZLMediaKit Wiki · GitHub
1、获取代码
请勿使用github下载zip包的方式下载源码,务必使用git克隆ZLMediaKit的代码,因为ZLMediaKit依赖于第三方代码,zip包不会下载第三方依赖源码,操作如下:
# 国内用户推荐从同步镜像网站gitee下载
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千万不要忘记执行这句命令
git submodule update --init
2、编译器
2.1、编译器版本要求
ZLMediaKit采用了C++11的语法和库,要求编译器支持完整的C++11标准,即:
Linux上要求gcc版本 >= 4.8(4.7应该也能支持)
2.2、安装编译器
Ubuntu系统一般自带的gcc版本够新,安装gcc编译器参考:
sudo apt-get install build-essential
# 通过该命令查看gcc版本
gcc -v
3、cmake
ZLMediaKit采用cmake来构建项目,通过cmake才能生成Makefile(或Xcode/VS工程),所以必须先安装cmake才能完成后续步骤。
Ubuntu系统一般自带的cmake版本够新,安装cmake参考:
sudo apt-get install cmake
# 通过该命令查看cmake版本
cmake -version
4、依赖库
4.1、依赖库列表
ZLMediaKit可选依赖一些第三方库,这些库都不是必选的;在构建ZLMediaKit时,cmake能查找系统路径中的这些库,并根据安装情况选择是否开启相关特性,你可以选择安装这些依赖并启用相关特性:
-
openssl
-
flash player在播放rtmp时,采用的是复杂握手模式,如果不安装该库,flash player将播放不了zlmediakit 提供的rtmp url.
-
同时ZLMediaKit的https/rtsps/webrtc相关功能需要使用openssl才能开启。
-
-
ffmpeg
zlmediakit可以通过fork ffmpeg进程的方式实现多种协议的拉流,编译时不需要安装FFmpeg。
-
sdl、avcodec、avutil
这3个库供ZLMediaKit的test_player测试程序使用,你通常不需要安装这3个库。
4.2、安装依赖库
Ubuntu系统下安装依赖的方法:
# openssl必须安装, 其他选择性安装(如果使用ffmpeg推流,那ffmpeg需要安装)
sudo apt-get install libssl-dev
sudo apt-get install libsdl-dev
sudo apt-get install libavcodec-dev
sudo apt-get install libavutil-dev
sudo apt-get install ffmpeg
5、构建和编译项目
由于开启webrtc相关功能比较复杂,默认是不开启编译的,如果对zlmediakit的webrtc功能比较感兴趣,请参考官方文档。
在Linux系统下,按以下方式编译:
cd ZLMediaKit
mkdir build
cd build
cmake ..
make -j4
6、运行
ZLMediaKit工程主要生成3种二进制目标文件,他们的生成的路径在release目录下,这些目标文件主要分为:MediaServer进程; c api 的SDK; 以test_开头的测试程序。
此处仅运行MediaServer进程。
MediaServer是ZLMediaKit作为服务器的主进程,该进程可以在免去开发的情况下直接作为测试流媒体服务器使用,如果你需要更复杂的业务逻辑,可以通过Web HOOK和RESTful API实现,同时你可以通过配置文件控制其参数。
cd ZLMediaKit/release/linux/Debug
# 通过-h可以了解启动参数
./MediaServer -h
# 以守护进程模式启动
./MediaServer -d &
二、推流测试
ZLMediaKit支持rtsp/rtmp/rtp推流,一般通常使用obs/ffmpeg推流测试,其中FFmpeg推流命令支持以下:
1、使用rtsp方式推流
# h264推流
ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
# h265推流
ffmpeg -re -i "/path/to/test.mp4" -vcodec h265 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
2、使用rtmp方式推流
# 如果未安装FFmpeg,你也可以用obs推流
ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test
# RTMP标准不支持H265,但是国内有自行扩展的,如果你想让FFmpeg支持RTMP-H265,
# 请按照此文章编译:https://github.com/ksvc/FFmpeg/wiki/hevcpush
3、使用rtp方式推流
# 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
三、拉流
1、使用VLC工具拉流
ffmpeg -re -i "/path/to/test.mp4" -vcodec h265 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
以Rtsp为例,"/path/to/test.mp4" 替换为当前文件路径下需要推流的MP4文件路径,rtsp://127.0.0.1/live/test 则是推流的地址。
ZLMediaKit一般会把rtsp、rtmp流媒体源互相转换,也会转换成hls/http-ts/ws-ts/http-fmp4/ws-fmp4,播放的url如下:
具体可参考:ZLMediaKit - 播放url规则
HLS(mpegts) :
http://somedomain.com/live/0/hls.m3u8
https://somedomain.com/live/0/hls.m3u8
http://127.0.0.1/live/0/hls.m3u8?vhost=somedomain.com
https://127.0.0.1/live/0/hls.m3u8?vhost=somedomain.com
HLS(fmp4):
http://somedomain.com/live/0/hls.fmp4.m3u8
https://somedomain.com/live/0/hls.fmp4.m3u8
http://127.0.0.1/live/0/hls.fmp4.m3u8?vhost=somedomain.com
https://127.0.0.1/live/0/hls.fmp4.m3u8?vhost=somedomain.com
因此,只需要在网络串流中输入上述服务中启动的地址,即可拉流:
2、使用html网页拉流
使用 video.js 和 HLS.js,
video.js 与 HLS.js 的组合是最常见的方案。为了进一步确认是否是浏览器兼容性问题,确保使用正确的库和设置。代码示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HLS Stream</title>
<!-- 引入 Video.js 样式 -->
<link href="https://cdn.jsdelivr.net/npm/video.js/dist/video-js.min.css" rel="stylesheet">
<!-- 引入 HLS.js 库 -->
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body>
<h1>HLS Stream Demo</h1>
<!-- 创建一个 video 标签 -->
<video id="video" class="video-js vjs-default-skin" controls>
<source src="http://192.168.198.170/live/stream/hls.m3u8" type="application/x-mpegURL">
</video>
<!-- 引入 Video.js 脚本 -->
<script src="https://cdn.jsdelivr.net/npm/video.js/dist/video.min.js"></script>
<script>
var video = document.getElementById('video');
// 判断浏览器是否支持 HLS
if (Hls.isSupported()) {
var hls = new Hls();
// 当 HLS 播放列表加载完毕,启动播放
hls.loadSource('http://192.168.198.170/live/stream/hls.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, function () {
video.play();
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// 对于支持 HLS 的浏览器(如 Safari),直接使用原生支持
video.src = 'http://192.168.198.170/live/stream/hls.m3u8';
video.addEventListener('loadedmetadata', function () {
video.play();
});
}
</script>
</body>
</html>
Html需要通过服务访问才能拉流成功,请勿通过本地文件访问。
如何快速将Html在本地上线,可通过vscode安装Live Server拓展,将网页部署在本地,具体操作可查阅相关资料。