共计 3125 个字符,预计需要花费 8 分钟才能阅读完成。
前言
随着新冠疫情的影响,这两年音视频的需要呈爆发式增长。在音视频畛域中,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" > ~/.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 所有 release 版本的信息
装置编译依赖
获取到 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 ';'