ZLMediaKit: 快速入门

目录

ZLMediaKit是什么

ZLMediaKit一个基于C++11的高性能运营级流媒体服务框架,支持多种协议,支持协议互转,打通了视频监控协议栈与直播协议栈, 支持集群、按需转协议、按需推拉流、先播后推、断连续推等功能,支持多轨道模式(一个流中多个视频/音频)。

它的Gitee地址:https://gitee.com/xia-chu/ZLMediaKit

编译

拉取ZLMediaKit。

bash 复制代码
git clone git@gitee.com:xia-chu/ZLMediaKit.git

安装依赖库

  • 安装FFmpeg :用于处理多媒体数据,Ubuntu下执行sudo apt-get install ffmpeg

构建项目

在ZLMediaKit目录下创建build目录并进入,执行cmake..,然后执行make -j4进行编译。

bash 复制代码
cd ZLMediaKit
mkdir build
cd build
cmake ..
make -j4

问题处理

问题1: srtp 未找到, WebRTC 相关功能打开失败

cmake时遇到下面的错误

错误1:

bash 复制代码
-- srt 功能已开启
CMake Warning at webrtc/CMakeLists.txt:28 (message):
srtp 未找到, WebRTC 相关功能打开失败

解决方法:安装 SRTP 库

bash 复制代码
sudo apt-get install libsrtp2-dev

问题2:依赖库问题

bash 复制代码
-- Configuring done (2.7s)
CMake Error at 3rdpart/CMakeLists.txt:32 (add_library):
No SOURCES given to target: jsoncpp


CMake Error at 3rdpart/CMakeLists.txt:55 (add_library):
No SOURCES given to target: mov


CMake Error at 3rdpart/CMakeLists.txt:68 (add_library):
No SOURCES given to target: flv


CMake Error at 3rdpart/CMakeLists.txt:91 (add_library):
No SOURCES given to target: mpeg


CMake Error at 3rdpart/CMakeLists.txt:201 (add_library):
No SOURCES given to target: zltoolkit

ZLMediaKit 项目里有一些依赖库是通过 Git 子模块来管理的。你需要保证所有子模块都已正确初始化并且更新。在项目根目录下执行以下命令:

bash 复制代码
git submodule update --init --recursive

安装

如果需要安装到系统中,执行sudo make install

配置和运行

  • 修改配置文件 :配置文件位于conf目录下,可按需修改。如修改config.ini中的apiDebug等参数。
  • 启动ZLMediaKit :在ZLMediaKit/release/linux/Debug目录下,可执行./MediaServer -h查看启动参数,
bash 复制代码
./MediaServer -h
2025-03-03 21:15:10.198 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: H264
2025-03-03 21:15:10.219 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: H265
2025-03-03 21:15:10.223 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: JPEG
2025-03-03 21:15:10.228 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: mpeg4-generic
2025-03-03 21:15:10.228 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: opus
2025-03-03 21:15:10.228 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: PCMA
2025-03-03 21:15:10.228 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: PCMU
2025-03-03 21:15:10.228 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: L16
2025-03-03 21:15:10.236 I [MediaServer] [5747-MediaServer] Factory.cpp:35 registerPlugin | Load codec: MP3
-h --help 无参 默认:null 选填 打印此信息
-d --daemon 无参 默认:null 选填 是否以Daemon方式启动
-l --level 有参 默认:1 选填 日志等级,LTrace~LError(0~4)
-m --max_day 有参 默认:7 选填 日志最多保 存天数
-c --config 有参 默认:/mnt/d/ubunt/xmr/program/cpp/ZLMediaKit/release/linux/Debug/config.ini 选填 配置文件路 径
-s --ssl 有参 默认:/mnt/d/ubunt/xmr/program/cpp/ZLMediaKit/release/linux/Debug/default.pem 选填 ssl证书文件或文件夹,支持p12/pem类型
-t --threads 有参 默认:16 选填 启动事件触 发线程数
--affinity 有参 默认:1 选填 是否启动cpu亲和性设置
-v --version 无参 默认:null 选填 显示版本号
--log-slice 有参 默认:100 选填 最大保存日 志切片个数
--log-size 有参 默认:256 选填 单个日志切 片最大容量,单位MB
--log-dir 有参 默认:/mnt/d/ubunt/xmr/program/cpp/ZLMediaKit/release/linux/Debug/log/ 选填 日志保存文 件夹路径

2025-03-03 21:15:10.441 I [MediaServer] [5747-MediaServer] logger.cpp:91 ~Logger |

./MediaServer -d &以守护进程模式启动。

bash 复制代码
sudo ./MediaServer -d &

问题处理

问题1: 无权限监听554端口

启动./MediaServer -d时显示无权限监听554端口

bash 复制代码
2025-03-03 21:41:18.193 W [MediaServer] [5879-MediaServer] sockutil.cpp:433 bind_sock6 | Bind socket failed: permission denied
2025-03-03 21:41:18.227 E [MediaServer] [5879-MediaServer] main.cpp:448 start_main | Start server failed: Listen on :: 554 failed: permission denied
2025-03-03 21:41:19.241 W [MediaServer] [5876-MediaServer] System.cpp:153 operator() | 收到主动退出信号,关闭父进程与子进程
2025-03-03 21:41:19.249 I [MediaServer] [5876-MediaServer] logger.cpp:91 ~Logger |

使用sudo执行。

问题2: 80端口已经被使用

bash 复制代码
2025-03-03 21:41:28.908 W [MediaServer] [5906-MediaServer] sockutil.cpp:433 bind_sock6 | Bind socket failed: address already in use
2025-03-03 21:41:28.967 E [MediaServer] [5906-MediaServer] main.cpp:448 start_main | Start server failed: Listen on :: 80 failed: address already in use
2025-03-03 21:41:29.973 W [MediaServer] [5903-MediaServer] System.cpp:153 operator() | 收到主动退出信号,关闭父进程与子进程
2025-03-03 21:41:29.985 I [MediaServer] [5903-MediaServer] logger.cpp:91 ~Logger |
  • 处理
    80端口被占用,是因为MediaServer处理http时,使用80端口,我采用不处理http的解决方式。
    打开MediaServer的connf.ini(和MediaServer在同一个目录下), 关闭http功能。
    将http下的port由80修改为-1
bash 复制代码
[http]
port=-1

重新启动MediaServer,查看是否启动成功(554是否监听)

bash 复制代码
sudo ./MediaServer -d &
netstat -ant | grep 554
tcp6 0 0 :::554 :::* LISTEN

推流测试

RTSP推流

准备

准备视频文件

找一段mp4视频,放到特定目录下,例如:/path/to/test.mp4, 稍后使用ffmpeg将视频推送的ZLMediaKit

安装VLC

安装VL用来拉取ZLMediaKit转发的数据流

推流

执行下面的推流命令,将test.mp4推送到 rtsp://127.0.0.1/live/test

bash 复制代码
ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
  • -re:以本地帧率读取输入文件,模拟实时流。
  • -i "/path/to/test.mp4":指定输入的视频文件路径。
  • -vcodec h264:设置视频编码格式为 H.264。
  • -acodec aac:设置音频编码格式为 AAC。
  • -f rtsp:指定输出格式为 RTSP。
  • -rtsp_transport tcp:使用 TCP 作为 RTSP 传输协议。
  • rtsp://127.0.0.1/live/test:推流的目标地址,127.0.0.1 是 ZLMediaKit 服务器的 IP 地址,live 是应用名,test 是流名称。
  • 建议添加 -stream_loop -1参数,实现循环推流,否则,如果test.mp4比较小,很快会推流结束
bash 复制代码
ffmpeg -stream_loop -1 -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test

拉流验证

使用 VLC 等播放器进行拉流验证。在 VLC 中选择"媒体" -> "打开网络串流",输入推流地址 rtsp://127.0.0.1/live/test 即可观看视频。

问题:拉流失败

如果是在windows下,使用wsl+ubuntu,在ubunut环境下启动MediaServer和推流, 则不能使用rtsp://127.0.0.1/live/test地址进行拉流。

在 WSL(Windows Subsystem for Linux)的 Ubuntu 中启动 MediaServer 并通过 FFmpeg 推 RTSP 流到 rtsp://127.0.0.1/live/test ,在 Windows 下使用 VLC 播放时,需要注意 WSL 和 Windows 之间的网络通信情况。

  • 获取 WSL 的 IP 地址
    在 WSL 的 Ubuntu 终端中,使用以下命令获取 WSL 的 IP 地址:
bash 复制代码
ip addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

该命令会输出 WSL 的 IP 地址,例如 172.28.224.1。

  • 在 VLC 中设置 RTSP 路径
    在 Windows 下打开 VLC 播放器,选择 "媒体" -> "打开网络串流",在输入框中输入 RTSP 路径,格式为:
    plaintext
    rtsp://<WSL的IP地址>/live/test

例如,如果 WSL 的 IP 地址是 172.28.224.1,则输入 rtsp://172.28.224.1/live/test,然后点击 "播放" 按钮。

ZLMediaKit 在 RTSP 推流测试中的作用

接收推流数据

ZLMediaKit 作为 RTSP 服务器,监听指定的端口(默认 554),等待客户端(如 FFmpeg)发起的 RTSP 推流请求。当接收到请求后,它会与客户端建立 RTSP 会话,并接收客户端发送的音视频流数据

协议处理

  • RTSP 协议解析:ZLMediaKit 会对 RTSP 协议进行解析,处理客户端发送的各种 RTSP 请求,如 OPTIONS、DESCRIBE、SETUP、PLAY 等,确保会话的正常建立和数据的正确传输。
  • RTP/RTCP 处理:RTSP 通常与 RTP(Real-time Transport Protocol)和 RTCP(Real-time Transport Control Protocol)一起使用。ZLMediaKit 会处理 RTP 数据包,将其还原为音视频流,并通过 RTCP 协议进行流的控制和反馈。

流管理

  • 流注册:当接收到新的推流时,ZLMediaKit 会将该流进行注册,记录流的相关信息,如流名称、应用名、编码格式等。
  • 流分发:ZLMediaKit 可以将接收到的流分发给多个拉流客户端。当有拉流请求时,它会根据流的注册信息,将相应的流数据发送给拉流客户端。

存储和转发

  • 存储:ZLMediaKit 支持将接收到的流数据进行存储,如保存为本地文件或写入数据库,方便后续的回放和分析。
  • 转发:可以将接收到的流转发到其他服务器,实现流的多级分发和跨网络传输。

流的流转过程

推流阶段

  1. 客户端发起请求:FFmpeg 作为推流客户端,向 ZLMediaKit 服务器发送 RTSP OPTIONS 请求,询问服务器支持的 RTSP 方法。
  2. 服务器响应:ZLMediaKit 服务器收到 OPTIONS 请求后,返回支持的 RTSP 方法列表。
  3. 客户端发送 DESCRIBE 请求:FFmpeg 发送 DESCRIBE 请求,获取服务器上的媒体描述信息(SDP,Session Description Protocol)。
  4. 服务器返回 SDP:ZLMediaKit 服务器返回 SDP 信息,包含音视频流的编码格式、传输地址等信息。
  5. 客户端发送 SETUP 请求:FFmpeg 根据 SDP 信息,发送 SETUP 请求,设置传输通道和参数。
  6. 服务器响应 SETUP:ZLMediaKit 服务器响应 SETUP 请求,确认传输通道和参数。
  7. 客户端发送 PLAY 请求:FFmpeg 发送 PLAY 请求,开始推流。
  8. 数据传输:FFmpeg 将音视频数据封装成 RTP 数据包,通过 TCP 或 UDP 发送给 ZLMediaKit 服务器。

拉流阶段

  1. 拉流客户端发起请求:VLC 等拉流客户端向 ZLMediaKit 服务器发送 RTSP OPTIONS 请求。
  2. 服务器响应:ZLMediaKit 服务器返回支持的 RTSP 方法列表。
  3. 拉流客户端发送 DESCRIBE 请求:获取媒体描述信息。
  4. 服务器返回 SDP:ZLMediaKit 服务器返回 SDP 信息。
  5. 拉流客户端发送 SETUP 请求:设置传输通道和参数。
  6. 服务器响应 SETUP:确认传输通道和参数。
  7. 拉流客户端发送 PLAY 请求:开始拉流。
  8. 数据传输:ZLMediaKit 服务器将接收到的音视频流数据封装成 RTP 数据包,发送给拉流客户端。
相关推荐
爱学习的大牛12325 天前
WebRTC 客户端与ZLMediaKit通讯
webrtc·zlmediakit
Naylor3 个月前
使用Nginx搭建流媒体服务器
流媒体服务器·nginx-http-flv-module
北国1373 个月前
python端拉流检测后再推流到流媒体服务器实现前端拉流查看(多摄像头切换)
服务器·前端·python·opencv·流媒体服务器
、、、、南山小雨、、、、5 个月前
ZLMediaKit编译运行
zlmediakit
Daniel大人6 个月前
ZLMediaKit编译webrtc
webrtc·zlmediakit
HSJ01709 个月前
SRS、ZLMediakit音视频流媒体服务器
音视频·srs·zlmediakit
belldeep9 个月前
python:如何创建简单的流媒体服务器来播放.flv文件
python·流媒体服务器·flv
aqi0010 个月前
FFmpeg开发笔记(二十七)APP无法访问ZLMediaKit的HLS直播地址
ffmpeg·音视频·直播·zlmediakit·hls
꧁白杨树下꧂1 年前
编译ZLMediaKit(win10+msvc2019_x64)
zlmediakit