前言
随着新冠疫情的影响,这两年音视频的需求呈爆发式增长。在音视频领域中,WebRTC可以说是一个绕不开宝库,包括了音视频采集、编解码、传输、渲染的全过程。本文主要记录下在Linux平台上编译WebRTC Linux和Android版本的全过程。
需要首先说明的是官方推荐编译使用的Linux系统是Ubuntu,因为WebRTC主要是在Ubuntu下开发的。
设置代理
因为众所周知的原因,要下载WebRTC的源码是需要代理工具的。
export http_proxy="http://127.0.0.1:7777"
export https_proxy="http://127.0.0.1:7777"
安装工具depot_tools
git clone获取depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
将depot_tools的路径配置到环境变量中
echo "export PATH=$PWD/depot_tools:$PATH" > ~/.bashrc
source ~/.bashrc
下载webrtc源码
从这里开始Linux和Android版本的命令就有写区别了。
Linux版本:
mkdir webrtc
cd webrtc
fetch --nohooks webrtc
gclient sync
Android版本:
mkdir webrtc
cd webrtc
fetch --nohooks webrtc_android
gclient sync
默认下载的是最新的源码,如果想要切换到指定分支,可以使用以下命令:
# 查看可用版本分支
git branch -r
# 切换到m79分支
git checkout branch-heads/m79
gclient sync
# 或者强制切换到指定commit(b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b是m79最后一次提交的commit id)
gclient sync -r b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b --force
安装编译依赖
获取到webrtc源码后需要执行几个脚本来安装编译依赖。
Linux版本:
cd src
./build/install-build-deps.sh
Android版本:
cd src
./build/install-build-deps.sh
./build/install-build-deps-android.sh
source build/android/envsetup.sh
编译
Linux版本:
默认情况下,Linux 下基于 ninja 编译的话,其编译器使用的是 clang,且其依赖的 stdc 标准库为其 ./buildtools/third_party/libc++ 内置的,所以如果外部想要基于 clang 编译的 libwebrtc.a 进行开发的话,上层依然需要使用 clang 做为编译器,且链接 webrtc 内部的 libc++ 标准库,否则将会产生各种
error: undefined reference to symbol ...
,无法解决。
# clang编译x64版
gn gen out/Release-clang --args='target_os="linux" target_cpu="x64" is_debug=false is_component_build=false rtc_include_tests=false rtc_build_examples=false'
ninja -C out/Release-clang
# gcc编译x64版
gn gen out/Release-gcc --args='target_os="linux" target_cpu="x64" is_debug=false is_component_build=false use_sysroot=false is_clang=false use_lld=false treat_warnings_as_errors=false rtc_include_tests=false rtc_build_examples=false use_custom_libcxx=false use_rtti=true'
ninja -C out/Release-gcc
# gcc编译arm64版(需要先安装编译工具)
build/linux/sysroot_scripts/install-sysroot.py --arch=arm64
gn gen out/Release-arm64 --args='target_os="linux" target_cpu="arm64" is_debug=false is_component_build=false use_sysroot=false is_clang=false use_lld=false treat_warnings_as_errors=false rtc_include_tests=false rtc_build_examples=false use_custom_libcxx=false use_rtti=true'
ninja -C out/Release-arm64
编译成功后,在out/xxx//obj文件夹下生成静态库——libwebrtc.a。
Android版本:
# 编译arm-v7版
gn gen out/Release-arm-v7a --args='target_os="android" target_cpu="arm" is_debug=false rtc_include_tests=false rtc_build_examples=false'
ninja -C out/Release-arm-v7a
# 编译arm-v8版
gn gen out/Release-arm-v8a --args='target_os="android" target_cpu="arm64" is_debug=false rtc_include_tests=false rtc_build_examples=false'
ninja -C out/Release-arm-v8a
编译成功后,在out/xxx/lib.java/sdk/android中生成jar包——libwebrtc.jar,在out/xxx中生成Android使用的静态库——libjingle_peerconnection_so.so。
Android中也可以直接编译aar包:
./tools_webrtc/android/build_aar.py --build-dir out --arch "armeabi-v7a" "arm64-v8a"
编译成功后,在/src目录下生成——libwebrtc.aar ,包含了 armeabi-v7a、arm64-v8a 两种架构的so。
提取webrtc项目中的所有头文件
find . -maxdepth 1 -name "*.h" -exec cp --parents '{}' /home/xxx/workspace/webrtc/include ';' && find api audio base call common_audio common_video logging media modules p2p pc rtc_base rtc_tools sdk stats system_wrappers third_party video -name "*.h" -exec cp --parents '{}' /home/xxx/workspace/webrtc/include ';'