当前位置: 首页 > news >正文

别再折腾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_init
  • MediaServer 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/test

RTMP推流测试:

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 nobuffer

7. 常见问题解决方案

在实际部署中,你可能会遇到以下问题:

问题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。解决方案是:

  1. 确认libsrtp编译时使用了--enable-openssl选项
  2. 重新编译libsrtp并确保它链接到了正确的OpenSSL版本

问题3:推流成功但拉流无画面

检查以下几点:

  1. 确保防火墙没有阻止相关端口
  2. 检查config.ini中的端口配置是否正确
  3. 查看MediaServer日志获取更多信息

8. 性能优化建议

为了让你的ZLMediaKit服务器发挥最佳性能,可以考虑以下优化:

  1. 调整线程数:在config.ini中修改threads参数,通常设置为CPU核心数的1.5-2倍

    [general] threads=8
  2. 启用TCP_NODELAY:减少网络延迟

    [rtsp] tcp_nodelay=1
  3. 调整缓冲区大小:根据网络条件优化

    [rtmp] chunk_size=4096
  4. 启用GOP缓存:实现秒开效果

    [hls] gop_cache=1

在实际项目中部署ZLMediaKit时,建议结合Nginx做反向代理和负载均衡,同时考虑使用systemd来管理MediaServer进程,确保服务稳定运行。

http://www.jsqmd.com/news/907406/

相关文章:

  • Midjourney Remix mode保姆级教程:手把手教你修改提示词,让AI更懂你
  • 脉冲神经网络与二进制权重的能效优化技术
  • UE4半透明材质性能优化全指南:从Surface模式选择到RTGI参数调优
  • 千问大模型在阿里生态中的核心应用场景与落地价值
  • 告别‘一大片爆红’:手把手教你用CMake-GUI无错配置VTK(Windows/VS2022版)
  • 避坑指南:DataSophon部署中那些官方文档没细说的坑(防火墙、MySQL、Nginx配置)
  • 模型迁移的“翻译官”——AMCT异构计算管理实战与自定义算子解决方案
  • 形式化验证赋能可解释AI:ViTaX框架如何保证解释的鲁棒性与必要性
  • 【评测】CSDN大模型热点洞察创作流程与评测
  • QiLink 项目的发起人徐玉生孤岛筑塔与温柔渗透
  • [智能体-106]:在相同的输入的情况下,每次调用,大模型具有相同的输出或具有不同的输出的原理?
  • 别再自己造轮子了!盘点那些能直接提升UniApp开发效率的34个原生插件
  • Vue+Element UI项目里,Table数据刷新后展开状态丢失?教你用expand-row-keys动态恢复
  • 【OpenClaw篇】OpenClaw 实战入门:在 VMware 虚拟机里部署第一个本地 AI Agent
  • BarTender 2022 Print Portal安装踩坑实录:从‘无法访问localhost’到成功部署的完整排错
  • 如何3分钟搞定QQ空间数据备份:GetQzonehistory终极指南 [特殊字符]
  • PCA降维后数据还能‘还原’吗?用Python实战带你理解信息损失与重构误差(附避坑指南)
  • 生成式AI重塑网络安全攻防:开发者如何构建AI增强型防御体系
  • 告别繁琐组态:用SVG+JavaScript手搓一个可复用的HMI仪表盘组件
  • 第4章:寄生虫时代——当AI学会呼吸
  • FlashAttention训练反向传播:梯度是怎么传回来的?
  • SAP推出AI智能体中枢,统一管理企业多厂商智能体
  • Axure RP安装(已汉化)附下载地址
  • 用DeepXDE搞定薛定谔方程:一个Python物理信息神经网络(PINN)实战教程
  • PyEcharts常用图
  • Mermaid Live Editor:免费在线图表编辑器的终极解决方案,轻松创建专业图表
  • 别再为layui上传进度条发愁了!手把手教你用layer弹窗实现文件上传进度可视化(附完整PHP后端代码)
  • 宽频抗干扰更稳定:鼎讯信通 ZN‑061A 手持式信号综合分析仪应用
  • 为什么92%的团队用Sora 2做不出可用元宇宙资产?揭秘3层隐性技术门槛与2024Q2最新破解方案
  • 5分钟搞定!中国科学技术大学Beamer模板终极使用指南