保姆级教程:在Ubuntu 14.04上为ARM平台交叉编译支持WebRTC的ZLMediaKit
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:$PATH
2. 关键依赖库的交叉编译
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=-std=c++11 -pthread -m64 # 修改为: CNF_CFLAGS=-pthread CNF_CXXFLAGS=-std=c++11 -pthread完整编译命令序列:
./config no-asm --prefix=/usr/openssl \ --cross-compile-prefix=aarch64-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 \ --host=aarch64-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_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"参数说明表:
| 参数 | 作用 | 典型值 |
|---|---|---|
| CMAKE_TOOLCHAIN_FILE | 指定交叉编译工具链 | ../cmake/aarch64.cmake |
| ENABLE_WEBRTC | 启用WebRTC功能 | ON |
| OPENSSL_ROOT_DIR | OpenSSL根目录 | /usr/openssl |
| CMAKE_PREFIX_PATH | 第三方库搜索路径 | "/usr/openssl;/usr/libsrtp" |
3.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.1:
scp /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的工具链较老,但通过合理配置仍能发挥出硬件的最佳性能。
