1. 环境准备:搭建ARM交叉编译基础
在开始为ZLMediaKit集成WebRTC之前,我们需要先搭建好交叉编译环境。这个过程就像准备一套特殊的厨具——虽然你平时用普通锅铲做饭,但现在要给远方的朋友做顿饭,得用他们厨房特有的工具。对于海思Hi3516/Hi3559这类ARM平台,我们需要在x86主机上配置对应的编译工具链。
我推荐使用Ubuntu 18.04或20.04作为宿主机系统(实测14.04的glibc版本太低,后期容易遇到依赖问题)。首先安装基础工具链:
sudo apt update sudo apt install -y git make cmake g++ pkg-config接下来配置交叉编译工具链。以海思aarch64-himix200-linux为例,需要特别注意两个关键点:
- 工具链路径配置:建议将工具链解压到/opt目录,然后添加环境变量:
export PATH=/opt/aarch64-himix200-linux/bin:$PATH export CC=aarch64-himix200-linux-gcc export CXX=aarch64-himix200-linux-g++- 32位兼容库安装(针对64位宿主机):
sudo apt install lib32z1 lib32ncurses5遇到过最典型的问题就是宿主机缺少32位库导致工具链无法识别。有次我在全新安装的Ubuntu 20.04上折腾了半天,最后发现就是这个基础依赖没装。建议先用aarch64-himix200-linux-gcc -v验证工具链是否可用。
2. 关键依赖库的交叉编译
2.1 OpenSSL的ARM适配
WebRTC强依赖OpenSSL,这里有个大坑:必须使用1.1.x版本(实测2.x版本兼容性有问题)。我推荐openssl-1.1.1k这个稳定版本,编译时要注意:
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz tar -xzf openssl-1.1.1k.tar.gz cd openssl-1.1.1k ./config no-asm --prefix=/usr/openssl \ --cross-compile-prefix=aarch64-himix200-linux-关键修改点在于必须编辑Makefile:
- 注释掉所有
-m64编译选项(ARM是32位架构) - 确认
-march=armv8-a参数存在
有一次我忘记修改Makefile,编译直接报"unrecognized command line option '-m64'"错误。建议编译完成后用file命令检查产物:
file /usr/openssl/bin/openssl # 应该显示ARM aarch64架构2.2 libsrtp的特殊处理
WebRTC的音视频传输依赖libsrtp库,这个库的交叉编译需要特殊技巧:
wget https://codeload.github.com/cisco/libsrtp/tar.gz/refs/tags/v2.3.0 tar -xzf libsrtp-2.3.0.tar.gz cd libsrtp-2.3.0必须修改configure文件第5902行:
sed -i '5902s/yes/no/' configure然后配置编译参数:
./configure --prefix=/usr/libsrtp \ --host=aarch64-himix200-linux \ CC=aarch64-himix200-linux-gcc \ --enable-openssl \ --with-openssl-dir=/usr/openssl这里有个隐藏坑点:如果configure时遇到"cannot run test program while cross compiling"错误,需要手动修改config.log文件中的测试项返回值。我通常直接修改为返回0,虽然粗暴但有效。
3. ZLMediaKit的定制化编译
3.1 源码获取与初始化
建议使用国内镜像源加速克隆:
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init特别注意:子模块初始化可能会失败,这时候需要手动修改.gitmodules文件中的URL为国内镜像地址。我遇到过最久的一次折腾了2小时,最后发现是submodule的github地址被墙。
3.2 关键配置文件修改
需要创建工具链文件cmake/aarch64.cmake,内容示例:
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(TOOLCHAIN_DIR /opt/aarch64-himix200-linux) set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-himix200-linux-gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-himix200-linux-g++) set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)还要修改cmake/FindSRTP.cmake,主要调整库查找路径:
set(SRTP_INCLUDE_DIRS /usr/libsrtp/include) set(SRTP_LIBRARIES /usr/libsrtp/lib/libsrtp2.a)3.3 编译参数详解
最终编译命令需要特别注意参数顺序:
mkdir build && cd build cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../cmake/aarch64.cmake \ -DENABLE_WEBRTC=ON \ -DENABLE_OPENSSL=ON \ -DOPENSSL_ROOT_DIR=/usr/openssl \ -DOPENSSL_LIBRARIES=/usr/openssl/lib \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH="/usr/openssl;/usr/libsrtp"常见问题排查:
- 如果报错找不到libsrtp,检查CMAKE_PREFIX_PATH是否包含所有依赖路径
- WebRTC启用失败时,先确认OpenSSL版本是否为1.1.x
- 链接阶段出错时,用
readelf -h检查所有库文件的架构是否一致
4. 部署与验证
编译产物位于build/release/linux/Release/目录,需要将以下文件部署到ARM设备:
- MediaServer可执行文件
- config.ini配置文件
- /usr/openssl和/usr/libsrtp下的库文件
验证WebRTC功能是否正常:
./MediaServer -c config.ini -s webrtc # 另开终端测试 curl http://设备IP:10000/webrtc/api/is_alive性能优化建议:
- 在ARM设备上设置LD_LIBRARY_PATH环境变量
- 调整config.ini中的threads参数(建议设为CPU核心数)
- 对于海思平台,可以启用硬件编解码选项
遇到过最棘手的运行时问题是GLIBC版本不匹配,解决方案是在编译机上用patchelf修改二进制文件的动态链接库路径。具体操作:
patchelf --set-interpreter /lib/ld-linux-aarch64.so.1 MediaServer patchelf --set-rpath /usr/local/lib MediaServer