目录
- ZLMediaKit是什么
- 编译
- 安装
- 配置和运行
- 问题处理
*- [问题1: 无权限监听554端口](#问题1: 无权限监听554端口)
- [问题2: 80端口已经被使用](#问题2: 80端口已经被使用)
- 问题处理
- 推流测试
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 支持将接收到的流数据进行存储,如保存为本地文件或写入数据库,方便后续的回放和分析。
- 转发:可以将接收到的流转发到其他服务器,实现流的多级分发和跨网络传输。
流的流转过程
推流阶段
- 客户端发起请求:FFmpeg 作为推流客户端,向 ZLMediaKit 服务器发送 RTSP OPTIONS 请求,询问服务器支持的 RTSP 方法。
- 服务器响应:ZLMediaKit 服务器收到 OPTIONS 请求后,返回支持的 RTSP 方法列表。
- 客户端发送 DESCRIBE 请求:FFmpeg 发送 DESCRIBE 请求,获取服务器上的媒体描述信息(SDP,Session Description Protocol)。
- 服务器返回 SDP:ZLMediaKit 服务器返回 SDP 信息,包含音视频流的编码格式、传输地址等信息。
- 客户端发送 SETUP 请求:FFmpeg 根据 SDP 信息,发送 SETUP 请求,设置传输通道和参数。
- 服务器响应 SETUP:ZLMediaKit 服务器响应 SETUP 请求,确认传输通道和参数。
- 客户端发送 PLAY 请求:FFmpeg 发送 PLAY 请求,开始推流。
- 数据传输:FFmpeg 将音视频数据封装成 RTP 数据包,通过 TCP 或 UDP 发送给 ZLMediaKit 服务器。
拉流阶段
- 拉流客户端发起请求:VLC 等拉流客户端向 ZLMediaKit 服务器发送 RTSP OPTIONS 请求。
- 服务器响应:ZLMediaKit 服务器返回支持的 RTSP 方法列表。
- 拉流客户端发送 DESCRIBE 请求:获取媒体描述信息。
- 服务器返回 SDP:ZLMediaKit 服务器返回 SDP 信息。
- 拉流客户端发送 SETUP 请求:设置传输通道和参数。
- 服务器响应 SETUP:确认传输通道和参数。
- 拉流客户端发送 PLAY 请求:开始拉流。
- 数据传输:ZLMediaKit 服务器将接收到的音视频流数据封装成 RTP 数据包,发送给拉流客户端。