引言:为什么我们需要自己编译WebRTC?

WebRTC(Web Real-Time Communication)是一个开源项目,它让网页和移动应用能够轻松实现实时音视频通信。你可能用过微信视频、腾讯会议,或者在网页上直接进行过视频聊天,其背后的核心技术之一就是WebRTC。

那么,既然WebRTC已经是开源的,为什么我们还需要自己动手编译呢?

  1. 定制化需求:官方提供的预编译库可能不包含我们需要的特定功能或编解码器(如H.264,这对于iOS设备兼容性至关重要)。
  2. 平台与架构适配:我们需要为特定的操作系统(如Linux)和CPU架构(如x64, arm64)生成库文件。
  3. 集成与修改:我们可能需要对WebRTC源码进行定制化修改,或将其与自己的项目深度集成。
  4. 学习与研究:编译过程本身就是深入理解WebRTC架构和依赖关系的最佳途径。

创建并进入工作容器

mkdir webrtc_dev
cd webrtc_dev/
docker stop libwebrtc_dev
docker rm libwebrtc_dev
docker run -it --privileged --net=host \
	-v $PWD:/home -w /home --name=libwebrtc_dev ubuntu:20.04 /bin/bash
docker exec -ti libwebrtc_dev bash

解释一下:

  • docker run: 从ubuntu:20.04镜像创建一个新容器并运行。
  • -it: 给我们一个交互式的终端。
  • --privileged: 赋予容器更高的权限,有些编译步骤需要。
  • --net=host: 让容器使用主机的网络,方便后续设置代理。
  • -v $PWD:/home: 将你当前目录(webrtc_dev)挂载到容器内的/home目录。这是关键! 它使得你在容器内编译的所有成果,都会保存在你本机的文件夹里,不会随着容器销毁而丢失。
  • --name libwebrtc_dev: 给容器起个名字,方便管理。
  • 最后,我们通过docker exec命令再次进入这个容器的终端。

现在,我们就置身于一个全新的Ubuntu 20.04系统里了,可以开始大展拳脚。

安装必要的工具链

apt update
apt install software-properties-common -y
add-apt-repository ppa:ubuntu-toolchain-r/ppa
apt update
apt install git gcc g++ build-essential -y
apt install curl wget file -y
apt install lsb-release -y
apt install sudo -y
apt install pkg-config -y
apt install python3.9 -y

配置网络代理

WebRTC的代码仓库和依赖主要位于国外,国内下载可能会非常慢。设置代理可以极大提升速度。

export HTTP_PROXY=http://your.proxy.address:port
export HTTPS_PROXY=http://your.proxy.address:port
git config --global http.proxy http://your.proxy.address:port
git config --global https.proxy http://your.proxy.address:port

获取depot_tools

WebRTC使用Google Chromium项目的定制化构建工具集——depot_tools。它管理着复杂的代码仓库和依赖关系。

cd /home
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

# 添加到PATH
echo 'export PATH="/home/depot_tools:$PATH"' >> ~/.bashrc
source ~/.bashrc

获取WebRTC源码

cd /home
mkdir libwebrtc_build
cd libwebrtc_build	

# 首先,创建一个名为`.gclient`的配置文件,它告诉`depot_tools`如何获取代码。
cat > .gclient << 'EOF'
solutions = [
  {
    "name"        : 'src',
    "url"         : 'https://github.com/webrtc-sdk/webrtc.git@m137_release',
    "deps_file"   : 'DEPS',
    "managed"     : False,
    "custom_deps" : {
    },
    "custom_vars": {},
  },
]
target_os  = ['linux']
EOF

# 然后,执行同步命令,这会下载数GB的WebRTC源码及其所有依赖。
gclient sync

# 同步完成后,进入`src`目录,并克隆`libwebrtc`仓库,它提供了将WebRTC编译成单个库(`libwebrtc.so`)的“配方”。
cd src
git clone https://github.com/webrtc-sdk/libwebrtc

# 为了让这个“配方”生效,我们需要打一个补丁,并对构建文件做一个小修改。
git apply libwebrtc/patchs/custom_audio_source_m137.patch 

sed -i 's/deps = \[ ":webrtc" \]/deps = [ ":webrtc","\/\/libwebrtc", ]/' BUILD.gn

# 安装编译Chromium/WebRTC所需的一整套开发库,如X11、音频、视频相关库等。
./build/install-build-deps.sh

# 配置构建参数
export ARCH=x64
gn gen out-debug/Linux-$ARCH --args="target_os=\"linux\" target_cpu=\"$ARCH\" is_debug=false rtc_include_tests=false rtc_use_h264=true ffmpeg_branding=\"Chrome\" is_component_build=false use_rtti=true use_custom_libcxx=false rtc_enable_protobuf=false"	

# 修复可能的Python链接问题
ln -s /usr/bin/python3.9 /usr/bin/python3 -f

# 执行编译
ninja -C out-debug/Linux-$ARCH libwebrtc

# 编译一个测试程序
g++ -I libwebrtc/include/ -o demo libwebrtc/.conan/test_package/main.cpp out-debug/Linux-x64/libwebrtc.so

更多推荐