Ubuntu 20.04下ZLMediaKit编译全攻略:从依赖安装到WebRTC推流测试
在流媒体开发领域,ZLMediaKit凭借其高性能和丰富的功能支持,已成为众多开发者的首选框架。特别是在WebRTC推拉流场景中,它展现出了卓越的稳定性和低延迟特性。本文将带你从零开始,在Ubuntu 20.04系统上完成ZLMediaKit的完整编译过程,并重点解决WebRTC模块配置中的常见问题。
1. 环境准备与依赖安装
在开始编译ZLMediaKit之前,确保你的Ubuntu 20.04系统已经更新到最新状态:
sudo apt update && sudo apt upgrade -y1.1 基础工具链安装
编译ZLMediaKit需要以下基础工具链:
sudo apt install -y build-essential cmake git pkg-config关键版本要求:
- GCC ≥ 7.3
- CMake ≥ 3.0
- Git ≥ 2.0
1.2 OpenSSL编译与配置
WebRTC功能需要特定版本的OpenSSL支持,建议从源码编译安装:
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 --openssldir=/usr/local/openssl shared zlib make -j$(nproc) sudo make install配置环境变量确保系统能找到新安装的OpenSSL:
echo 'export PATH=/usr/local/openssl/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc1.3 其他关键依赖
安装WebRTC所需的libsrtp库:
git clone https://github.com/cisco/libsrtp.git cd libsrtp ./configure --enable-openssl make -j$(nproc) && sudo make install安装多媒体相关依赖:
sudo apt install -y libssl-dev libsdl2-dev libavcodec-dev libavutil-dev ffmpeg2. ZLMediaKit源码获取与准备
2.1 克隆源码仓库
推荐使用国内镜像源加速下载:
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit.git cd ZLMediaKit2.2 初始化子模块
这是很多开发者容易忽略的关键步骤:
git submodule update --init --recursive注意:如果网络环境不佳,可能导致子模块下载失败。此时可以尝试多次执行该命令,或手动修改.gitmodules文件中的仓库地址为国内镜像源。
3. 编译配置与构建
3.1 创建构建目录
mkdir build && cd build3.2 CMake配置选项
启用WebRTC支持的核心配置命令:
cmake .. -DENABLE_WEBRTC=on \ -DOPENSSL_ROOT_DIR=/usr/local/openssl \ -DOPENSSL_LIBRARIES=/usr/local/openssl/lib常用编译选项:
| 选项 | 说明 | 默认值 |
|---|---|---|
| ENABLE_WEBRTC | 启用WebRTC支持 | OFF |
| ENABLE_SRT | 启用SRT协议支持 | OFF |
| ENABLE_RTPPROXY | 启用RTP代理功能 | OFF |
| BUILD_SHARED_LIBS | 构建动态链接库 | OFF |
3.3 开始编译
使用多核并行编译加速过程:
make -j$(nproc)3.4 常见编译问题解决
问题1:OpenSSL路径错误
症状:
Could NOT find OpenSSL, try to set the path to OpenSSL root folder...解决方案:
- 确保环境变量已正确设置
- 显式指定OpenSSL路径:
cmake .. -DOPENSSL_ROOT_DIR=/usr/local/openssl问题2:libsrtp链接失败
症状:
undefined reference to `srtp_init'解决方案:
- 检查libsrtp是否安装成功
- 添加链接路径:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH4. WebRTC推流测试实战
4.1 准备运行环境
编译完成后,生成的可执行文件位于:
cd release/linux/Debug复制Web测试页面:
cp -r ../../../www .生成SSL证书(用于HTTPS和WebRTC):
openssl req -newkey rsa:2048 -nodes -keyout ssl.key -x509 -days 365 -out ssl.crt cat ssl.key ssl.crt > ssl.pem4.2 启动媒体服务器
./MediaServer -s ./ssl.pem4.3 浏览器测试
访问以下URL进行测试:
https://[服务器IP]/webrtc/测试场景示例:
推流端:
- 点击"Push"按钮
- 允许浏览器访问摄像头和麦克风
- 观察视频是否正常传输
播放端:
- 点击"Play"按钮
- 输入推流端生成的流ID
- 检查视频延迟和画质
4.4 性能优化参数
在config.ini中添加以下WebRTC相关配置:
[webrtc] # 启用UDP传输 enable_udp=1 # 启用TCP传输 enable_tcp=1 # 端口范围 port_range=30000-40000 # 关键帧请求间隔 keyframe_gop=1005. 高级配置与生产环境部署
5.1 系统调优
提高文件描述符限制:
ulimit -n 65535调整内核网络参数:
echo 'net.core.rmem_max=4194304' | sudo tee -a /etc/sysctl.conf echo 'net.core.wmem_max=4194304' | sudo tee -a /etc/sysctl.conf sudo sysctl -p5.2 守护进程配置
创建systemd服务文件:
[Unit] Description=ZLMediaKit Media Server After=network.target [Service] Type=simple User=media WorkingDirectory=/opt/zlm/release/linux/Debug ExecStart=/opt/zlm/release/linux/Debug/MediaServer -c /opt/zlm/config.ini -s /opt/zlm/ssl.pem Restart=always RestartSec=5s [Install] WantedBy=multi-user.target5.3 监控与日志
启用详细日志记录:
[log] # 日志级别:0-4(0为最详细) level=3 # 日志文件路径 file_path=./logs # 单个日志文件大小(MB) max_size=506. WebRTC扩展功能开发
6.1 自定义信令协议
ZLMediaKit支持通过插件扩展WebRTC信令协议。基本开发流程:
- 创建插件目录结构:
webrtc-plugin/ ├── CMakeLists.txt └── src/ └── webrtc_signaling.cpp- 实现核心接口:
class WebRTCSignaling : public WebRTCInterface { public: void onOffer(const string &offer, const onResp &cb) override { // 处理SDP offer string answer = generateAnswer(offer); cb(answer); } };6.2 集成STUN/TURN服务
配置外网可访问的WebRTC服务:
[webrtc] # STUN服务器地址 stun_server=stun.l.google.com:19302 # TURN服务器配置 turn_server=turn:example.com:3478 turn_user=username turn_password=password6.3 性能监控接口
ZLMediaKit提供了丰富的API用于监控WebRTC会话状态:
GET /index/api/getWebRTCInfo响应示例:
{ "code": 0, "data": { "sessions": 15, "bitrate": 2500000, "loss_rate": 0.02 } }在实际项目部署中,我们发现WebRTC的UDP传输在跨运营商环境下可能会出现连接不稳定的情况。这时可以尝试启用TCP回退功能,或者结合QUIC协议来改善传输质量。对于大规模并发场景,建议将TURN服务器部署在边缘节点,并启用ZLMediaKit的集群模式来实现负载均衡。