目录
- ZLMediaKit是什么
- 编译
- 安装依赖库
- 构建项目
- 问题处理
- 问题1: srtp 未找到, WebRTC 相关功能打开失败
- 问题2:依赖库问题
- 安装
- 配置和运行
- 问题处理
- 问题1: 无权限监听554端口
- 问题2: 80端口已经被使用
- 推流测试
- RTSP推流
- 准备
- 推流
- 拉流验证
- ZLMediaKit 在 RTSP 推流测试中的作用
- 流的流转过程
ZLMediaKit是什么
ZLMediaKit一个基于C++11的高性能运营级流媒体服务框架,支持多种协议,支持协议互转,打通了视频监控协议栈与直播协议栈, 支持集群、按需转协议、按需推拉流、先播后推、断连续推等功能,支持多轨道模式(一个流中多个视频/音频)。
它的Gitee地址:https://gitee.com/xia-chu/ZLMediaKit
编译
拉取ZLMediaKit。- git clone git@gitee.com:xia-chu/ZLMediaKit.git
复制代码 安装依赖库
- 安装FFmpeg:用于处理多媒体数据,Ubuntu下执行sudo apt-get install ffmpeg。
构建项目
在ZLMediaKit目录下创建build目录并进入,执行cmake..,然后执行make -j4进行编译。- cd ZLMediaKit
- mkdir build
- cd build
- cmake ..
- make -j4
复制代码 问题处理
问题1: srtp 未找到, WebRTC 相关功能打开失败
cmake时遇到下面的错误
错误1:- -- srt 功能已开启
- CMake Warning at webrtc/CMakeLists.txt:28 (message):
- srtp 未找到, WebRTC 相关功能打开失败
复制代码 解决方法:安装 SRTP 库- sudo apt-get install libsrtp2-dev
复制代码 问题2:依赖库问题
- -- 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 子模块来管理的。你需要保证所有子模块都已正确初始化并且更新。在项目根目录下执行以下命令:- git submodule update --init --recursive
复制代码 安装
如果需要安装到系统中,执行sudo make install。
配置和运行
- 修改配置文件:配置文件位于conf目录下,可按需修改。如修改config.ini中的apiDebug等参数。
- 启动ZLMediaKit:在ZLMediaKit/release/linux/Debug目录下,可执行./MediaServer -h查看启动参数,
- ./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 &以守护进程模式启动。问题处理
问题1: 无权限监听554端口
启动./MediaServer -d时显示无权限监听554端口- 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端口已经被使用
- 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
重新启动MediaServer,查看是否启动成功(554是否监听)- 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- 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比较小,很快会推流结束
- 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 地址:
[code]ip addr show eth0 | grep -oP '(? |