
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 CCaarch64-himix200-linux-gcc export CXXaarch64-himix200-linux-g32位兼容库安装针对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-prefixaarch64-himix200-linux-关键修改点在于必须编辑Makefile注释掉所有-m64编译选项ARM是32位架构确认-marcharmv8-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 \ --hostaarch64-himix200-linux \ CCaarch64-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_WEBRTCON \ -DENABLE_OPENSSLON \ -DOPENSSL_ROOT_DIR/usr/openssl \ -DOPENSSL_LIBRARIES/usr/openssl/lib \ -DCMAKE_BUILD_TYPERelease \ -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