ARM平台流媒体实战Ubuntu 14.04下ZLMediaKit的WebRTC交叉编译指南当我们需要在嵌入式ARM设备上部署实时音视频服务时往往会遇到一个典型困境开发主机是x86架构的Ubuntu系统而目标设备却是ARM架构。更棘手的是企业生产环境中可能还沿用着Ubuntu 14.04这样的老版本系统。本文将手把手带您完成从零开始的完整交叉编译过程最终得到一个支持WebRTC的ZLMediaKit流媒体服务可执行文件。1. 环境准备与疑难排查在Ubuntu 14.04上搭建ARM交叉编译环境首要任务是解决这个古董级系统的软件源失效问题。由于官方早已停止维护我们需要先将apt源替换为可靠的存档镜像sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt-get update接下来安装基础编译工具链时64位主机需要特别注意32位兼容库的安装。这两个库看似不起眼却是后续交叉编译能否成功的关键sudo apt-get install -y gcc-multilib g-multilib \ lib32z1-dev lib32ncurses5-dev \ cmake make perl常见报错处理若出现E: Unable to locate package lib32z1-dev请检查上述源替换是否成功安装后执行aarch64-himix200-linux-gcc -v仍报错时尝试导出完整路径export PATH/opt/aarch64-himix200-linux/bin:$PATH2. 关键依赖库的交叉编译2.1 OpenSSL 1.1.1k定制编译ARM平台上的OpenSSL编译需要特别注意指令集兼容性问题。下载源码后关键的配置步骤需要规避几个坑点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修改Makefile前建议先备份原始文件。需要注释的-m64参数位于文件约第30行附近# 原始内容 CNF_CFLAGS-pthread -m64 CNF_CXXFLAGS-stdc11 -pthread -m64 # 修改为 CNF_CFLAGS-pthread CNF_CXXFLAGS-stdc11 -pthread完整编译命令序列./config no-asm --prefix/usr/openssl \ --cross-compile-prefixaarch64-himix200-linux- make -j$(nproc) sudo make install2.2 libsrtp 2.3.0的适配修改WebRTC的信令安全依赖libsrtp库但其configure脚本在交叉编译时需要特殊处理。解压源码后找到configure文件的5902行附近进行修改# 原始内容 if test $cross_compiling yes; then # 修改为 if test $cross_compiling no; then配置时需显式指定OpenSSL路径./configure --prefix/usr/libsrtp \ --hostaarch64-himix200-linux \ CC/opt/aarch64-himix200-linux/bin/aarch64-himix200-linux-gcc \ --enable-openssl \ --with-openssl-dir/usr/openssl编译安装后建议检查生成的库文件架构file /usr/libsrtp/lib/libsrtp2.a # 应显示ELF 64-bit LSB relocatable, ARM aarch643. ZLMediaKit的深度定制3.1 源码获取与子模块初始化使用深度克隆可以避免后续子模块更新问题git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init --recursive3.2 关键配置文件的修改在cmake/FindSRTP.cmake中需要绕过系统自动查找路径直接指定我们编译的版本# 注释掉原有find_path添加以下两行 set(SRTP_INCLUDE_DIRS /usr/libsrtp/include) set(SRTP_LIBRARIES /usr/libsrtp/lib/libsrtp2.a)创建工具链文件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)3.3 编译参数详解执行cmake时的每个参数都有其特定作用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参数说明表参数作用典型值CMAKE_TOOLCHAIN_FILE指定交叉编译工具链../cmake/aarch64.cmakeENABLE_WEBRTC启用WebRTC功能ONOPENSSL_ROOT_DIROpenSSL根目录/usr/opensslCMAKE_PREFIX_PATH第三方库搜索路径/usr/openssl;/usr/libsrtp3.4 编译与产物验证使用并行编译加速过程make -j$(nproc) MediaServer编译完成后检查生成的可执行文件file ../release/linux/Release/MediaServer # 应显示ELF 64-bit LSB executable, ARM aarch644. 部署与性能调优将编译好的MediaServer传输到ARM设备后还需要注意以下运行环境配置库依赖检查aarch64-himix200-linux-readelf -d MediaServer | grep NEEDED常见问题解决方案缺少libssl.so.1.1scp /usr/openssl/lib/libssl.so.1.1 arm_device:/usr/lib运行时崩溃export LD_LIBRARY_PATH/usr/openssl/lib:$LD_LIBRARY_PATHWebRTC连接失败检查STUN/TURN服务器配置验证UDP端口是否开放默认8000性能优化参数./MediaServer -c config.ini -m 3 -s 1024 # -m 3设置工作线程数 # -s 1024设置每个线程的栈大小(KB)在实际项目中我们发现ARMv8架构的设备上开启NEON指令集可以获得约30%的性能提升。虽然Ubuntu 14.04的工具链较老但通过合理配置仍能发挥出硬件的最佳性能。