别再折腾Docker了!Ubuntu 22.04上源码编译ZLMediaKit保姆级教程(含libsrtp/openssl避坑指南)
别再折腾Docker了!Ubuntu 22.04上源码编译ZLMediaKit保姆级教程(含libsrtp/openssl避坑指南)
如果你正在寻找一个高性能的流媒体服务器解决方案,ZLMediaKit无疑是一个值得考虑的选择。作为基于C++11开发的运营级框架,它支持RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP4等多种协议,并能实现协议间的互转。但在Ubuntu 22.04上通过源码编译安装ZLMediaKit时,openssl和libsrtp的版本兼容性问题常常让开发者头疼不已。本文将带你一步步解决这些难题,完成一个稳定可靠的编译安装。
1. 环境准备与依赖安装
在开始之前,请确保你的Ubuntu 22.04系统已经更新到最新状态:
sudo apt update && sudo apt upgrade -y接下来安装基础编译工具链:
sudo apt install -y git gcc make cmake python3 p7zip-full pkg-config \ autoconf automake build-essential libtool texi2html对于多媒体处理相关的依赖,建议安装以下软件包:
sudo apt install -y libass-dev libtheora-dev libva-dev libvdpau-dev \ libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \ zlib1g-dev libsdl2-dev libavcodec-dev libavutil-dev ffmpeg提示:虽然ZLMediaKit的文档提到"除了openssl其他都可以不安装",但完整安装这些依赖可以避免后续可能出现的各种奇怪问题。
2. OpenSSL的正确安装与配置
OpenSSL版本问题是ZLMediaKit编译过程中最常见的绊脚石。Ubuntu 22.04默认安装的OpenSSL 3.0与ZLMediaKit存在兼容性问题,我们需要手动编译安装OpenSSL 1.1.1。
首先下载OpenSSL 1.1.1稳定版源码:
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w配置并编译安装:
./config --prefix=/usr/local/openssl-1.1.1 --openssldir=/usr/local/openssl-1.1.1 shared zlib make -j$(nproc) sudo make install关键的一步是创建正确的符号链接:
sudo ln -sf /usr/local/openssl-1.1.1/lib/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1 sudo ln -sf /usr/local/openssl-1.1.1/lib/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1验证安装是否成功:
/usr/local/openssl-1.1.1/bin/openssl version # 应该显示 OpenSSL 1.1.1w ...3. 编译安装libsrtp的正确姿势
libsrtp是安全实时传输协议库,它的编译选项对ZLMediaKit至关重要。常见的错误包括:
srtp2/srtp.h: 没有那个文件或目录未定义标识符 HMAC_CTX_initMediaServer crash
首先获取libsrtp源码:
git clone https://github.com/cisco/libsrtp.git cd libsrtp关键配置命令(特别注意--enable-openssl选项):
./configure --enable-openssl --with-openssl-dir=/usr/local/openssl-1.1.1 make -j$(nproc) sudo make install运行测试确保编译正确:
cd test ./rtpw_test.sh # 应该看到"./rtpw_test.sh : done (test passed)"4. 获取并编译ZLMediaKit源码
现在我们可以开始编译ZLMediaKit本身了。首先获取源码:
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init在编译前,我们需要设置几个关键环境变量:
export PKG_CONFIG_PATH=/usr/local/openssl-1.1.1/lib/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=/usr/local/openssl-1.1.1/lib:$LD_LIBRARY_PATH开始编译:
mkdir build cd build cmake .. -DOPENSSL_ROOT_DIR=/usr/local/openssl-1.1.1 make -j$(nproc)编译完成后,你可以在ZLMediaKit/release/linux/Debug目录下找到生成的可执行文件。
5. 配置与运行MediaServer
将配置文件复制到可执行文件所在目录:
cp ../../../conf/config.ini ./根据你的需求修改config.ini文件,特别是端口设置:
[api] port=80 [ffmpeg] bin=/usr/bin/ffmpeg [rtsp] port=554 [http] port=80 [rtmp] port=1935启动MediaServer:
sudo ./MediaServer注意:如果遇到端口被占用的错误,请修改config.ini中相应的端口号。
6. 测试推流与拉流
现在你的ZLMediaKit服务器应该已经运行起来了。让我们测试一下基本功能。
RTSP推流测试:
ffmpeg -re -i test.mp4 -vcodec libx264 -bsf:v h264_mp4toannexb -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:554/live/testRTMP推流测试:
ffmpeg -re -i test.mp4 -vcodec libx264 -bsf:v h264_mp4toannexb -acodec aac -f flv rtmp://127.0.0.1:1935/live/test拉流测试(可以使用ffplay):
ffplay -i rtsp://127.0.0.1:554/live/test -fflags nobuffer ffplay -i rtmp://127.0.0.1:1935/live/test -fflags nobuffer7. 常见问题解决方案
在实际部署中,你可能会遇到以下问题:
问题1:启动时报错找不到libssl.so.1.1
解决方案:
sudo ln -s /usr/local/openssl-1.1.1/lib/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/ sudo ln -s /usr/local/openssl-1.1.1/lib/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/ sudo ldconfig问题2:ZLMediaKit崩溃,提示HMAC_CTX_init未定义
这通常是因为libsrtp没有正确链接到OpenSSL 1.1.1。解决方案是:
- 确认libsrtp编译时使用了
--enable-openssl选项 - 重新编译libsrtp并确保它链接到了正确的OpenSSL版本
问题3:推流成功但拉流无画面
检查以下几点:
- 确保防火墙没有阻止相关端口
- 检查config.ini中的端口配置是否正确
- 查看MediaServer日志获取更多信息
8. 性能优化建议
为了让你的ZLMediaKit服务器发挥最佳性能,可以考虑以下优化:
调整线程数:在config.ini中修改
threads参数,通常设置为CPU核心数的1.5-2倍[general] threads=8启用TCP_NODELAY:减少网络延迟
[rtsp] tcp_nodelay=1调整缓冲区大小:根据网络条件优化
[rtmp] chunk_size=4096启用GOP缓存:实现秒开效果
[hls] gop_cache=1
在实际项目中部署ZLMediaKit时,建议结合Nginx做反向代理和负载均衡,同时考虑使用systemd来管理MediaServer进程,确保服务稳定运行。
