1. 嵌入式设备WebRTC环境搭建

任务目标

在嵌入式Linux开发板(以ARM Cortex-A53为例)上完成WebRTC开发环境搭建,实现交叉编译工具链配置、关键依赖库(libsrtp、libevent、opus)的交叉编译,以及WebRTC源码的编译选项配置,最终生成可在目标板上运行的静态库与测试可执行文件。

环境与依赖

  • 主机:x86_64 Ubuntu 20.04+
  • 目标板:ARM Cortex-A53(aarch64架构)
  • 交叉编译工具链:gcc-aarch64-linux-gnu(主机执行 sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu)
  • WebRTC源码:使用 depot_tools 获取,版本分支 branch-heads/5481
  • 依赖库源码:libsrtp 2.x、libevent 2.1.x、opus 1.3.x

实现步骤与关键代码

1. 交叉编译工具链配置

创建环境变量脚本 set_env.sh,统一管理交叉编译参数:

#!/bin/bash
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export LD=${CROSS_COMPILE}ld
export SYSROOT=/usr/aarch64-linux-gnu
export PREFIX=$HOME/webrtc_arm_build
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
export CFLAGS="--sysroot=$SYSROOT -I$PREFIX/include"
export LDFLAGS="--sysroot=$SYSROOT -L$PREFIX/lib"
mkdir -p $PREFIX

2. 依赖库交叉编译

以下脚本 build_deps.sh 依次编译libsrtp、libevent、opus:

#!/bin/bash
source set_env.sh

# libsrtp
cd libsrtp
./configure --host=aarch64-linux-gnu --prefix=$PREFIX --enable-static --disable-shared
make -j4 && make install
cd ..

# libevent
cd libevent
./configure --host=aarch64-linux-gnu --prefix=$PREFIX --enable-static --disable-shared --disable-openssl
make -j4 && make install
cd ..

# opus
cd opus
./configure --host=aarch64-linux-gnu --prefix=$PREFIX --enable-static --disable-shared
make -j4 && make install
cd ..

3. WebRTC源码获取与编译配置

使用depot_tools获取源码后,创建编译参数文件 args.gn:

# 位于 src/ 目录下执行
gn gen out/arm --args='
target_os="linux"
target_cpu="arm64"
is_debug=false
is_component_build=false
rtc_use_h264=false
rtc_use_opus=true
rtc_include_tests=false
rtc_build_examples=false
use_custom_libcxx=false
sysroot="/usr/aarch64-linux-gnu"
extra_cflags=["--sysroot=/usr/aarch64-linux-gnu"]
extra_ldflags=["--sysroot=/usr/aarch64-linux-gnu"]
'

ninja -C out/arm webrtc

4. 最小验证程序

创建 test_webrtc.c 验证核心库链接正确性:

#include <stdio.h>
#include "rtc_base/strings/string_builder.h"

int main() {
    rtc::StringBuilder sb;
    sb << "WebRTC ARM build OK";
    printf("%s\n", sb.str().c_str());
    return 0;
}

编译命令:

source set_env.sh
${CXX} test_webrtc.c -I$PREFIX/webrtc/src \
    -L$PREFIX/webrtc/out/arm/obj \
    -lwebrtc -lpthread -ldl -lrt \
    -o test_webrtc_arm

运行与验证

  1. 将 test_webrtc_arm 拷贝至目标板:scp test_webrtc_arm root@<板卡IP>:/root/
  2. 目标板执行:chmod +x test_webrtc_arm && ./test_webrtc_arm
  3. 通过条件:输出 WebRTC ARM build OK,且 ldd test_webrtc_arm 显示仅依赖系统基础库(无未解析的WebRTC符号)

常见问题

  • gn无法识别sysroot:确认 /usr/aarch64-linux-gnu 目录存在且包含完整的libc头文件与库文件
  • opus编译失败:需在configure前执行 export CFLAGS="$CFLAGS -fPIC" 解决重定位问题
  • 链接时找不到libevent:检查 PKG_CONFIG_PATH 是否指向 $PREFIX/lib/pkgconfig