前言

随着新冠疫情的影响,这两年音视频的需要呈爆发式增长。在音视频畛域中,WebRTC能够说是一个绕不开宝库,包含了音视频采集、编解码、传输、渲染的全过程。本文次要记录下在Linux平台上编译WebRTC Linux和Android版本的全过程。

须要首先阐明的是官网举荐编译应用的Linux零碎是Ubuntu,因为WebRTC次要是在Ubuntu下开发的。

设置代理

因为家喻户晓的起因,要下载WebRTC的源码是须要代理工具的。

export http_porxy="http://127.0.0.1:7777"export https_porxy="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" > ~/.bashrcsource ~/.bashrc

下载webrtc源码

从这里开始Linux和Android版本的命令就有写区别了。

Linux版本:

mkdir webrtccd webrtcfetch --nohooks webrtcgclient sync

Android版本:

mkdir webrtccd webrtcfetch --nohooks webrtc_androidgclient sync

默认下载的是最新的源码,如果想要切换到指定分支,能够应用以下命令:

# 查看可用版本分支git branch -r# 切换到m79分支git checkout branch-heads/m79gclient sync# 或者强制切换到指定commit(b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b是m79最初一次提交的commit id)gclient sync -r b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b --force

能够在从这里获取webrtc所有release版本的信息

装置编译依赖

获取到webrtc源码后须要执行几个脚本来装置编译依赖。

Linux版本:

cd src./build/install-build-deps.sh

Android版本:

cd src./build/install-build-deps.sh./build/install-build-deps-android.shsource 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=arm64gn 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 ';'