0x00 前言
WebRTC 的源码使用 googlesource 进行维护,并没有放到 Github 上面,由于其依赖的第三方库比较多,所以下载和编译比较耗时,遇到的坑也比较多,本文记录在 Linux 和 MacOS 环境下编译 WebRTC 的实践过程和一些见解。
0x01 WebRTC native code 下载和编译
下面这个脚本可以在 Ubuntu 18.04 环境中下载和编译 WebRTC native code
#!/usr/bin/env bash
# WebRTC Compile bundles
# 0x00 Function for envrionment operation
# add new element to environment variable append mode
# $1 enviroment variable
# $2 new element
function env_append()
{
eval local env_var=\$\{${1}\-\}
local new_element=${2%/}
if [ -d "$new_element" ] && ! echo $env_var | grep -E -q "(^|:)$new_element($|:)" ; then
eval export $1="\${$1-}\${$1:+\:}${new_element}"
fi
}
# 0x01 Install depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
env_append PATH ${PWD}/depot_tools
# 0x02 Checkout WebRTC
mkdir -p webrtc-checkout && cd webrtc-checkout
fetch webrtc
# 当过程中断时,我们可以使用下面的命令恢复并继续
# gclient sync --verbose
# 0x03 Compile WebRTC
cd src
sudo ./build/install-build-deps.sh
gn gen out/Default
ninja -C out/Default
说明:
-
fetch
命令是depot_tools
中的一个工具,其原理是自动拉取 Chrome 工程相关的工具,WebRTC 是 Chrome 工程的一部分,fetch
还可以拉取 Chrome 其他的组件,可以通过fetch --help
查看可拉取的组件,分析depot_tools
目录中的fetch.py
文件可以发现,fetch
支持的 config 选项是从fetch_configs
目录下的*.py
文件中分析出的,我们打开depot_tools/fetch_configs/webrtc.py
文件分析发现 WebRTC 的 Git 地址为https://webrtc.googlesource.com/src.git
-
WebRTC 的 Repository 大小并不是很庞大,大约在 200MB ~ 300MB,但其依赖的第三方库却比较庞大,所有第三方库 pull 下来大约会占用 11GB 的空间,编译完成后加入目标文件和临时文件,会占用约 20GB 的磁盘空间。WebRTC 所依赖的第三方库信息记录在 src 目录下
DEPS
文件中。 -
除了使用
fetch
来拉取 WebRTC 工程外,还可以通过生成.gclient
文件直接拉取,这种方法适合与对 WebRTC 魔改后替换为自己的 Repo 地址#!/usr/bin/env bash cat << END > ./.gclient solutions = [ { "name": "src", "url": "https://webrtc.googlesource.com/src.git", "deps_file": "DEPS", "managed": False, "custom_deps": {}, }, ] END gclient sync --verbose
-
MacOS 环境需要安装 Xcode
0x02 WebRTC 工程结构
目录 | 说明 |
---|---|
api | 对外访问接口 |
audio | 音频相关网络逻辑层 |
call | 数据流的管理层,Call 代表同一端点的所有数据的流入流出 |
common_audio | 音频算法相关 |
common_video | 视频算法相关 |
data | 音视频测试数据文件 |
docs | 文档相关 docs/native-code/rtp-hdrext 为RTP头部拓展定义 |
examples | 示例代码 |
logging | 日志相关 |
media | 多媒体相关逻辑处理,如编解码的逻辑处理 |
modules | 所有子模块 |
p2p | Peer to Peer 相关,STUN/TURN |
pc | Peer Connection 相关的业务逻辑层 |
resources | 资源文件 |
rtc_base | 基础代码,如线程/锁 相关的统一接口 |
rtc_tools | 音视频分析相关的工具代码 |
sdk | 移动端 Android/IOS 的业务逻辑代码,如视频采集/视频渲染等 |
stats | 各种数据统计相关代码 |
style-guide | 代码风格说明 |
system_wrappers | 与操作系统相关的代码,如 CPU 特性/原子操作/时钟等 |
test | 测试相关 |
tools_webrtc | WebRTC 测试相关的工具代码,如网络模拟器 |
video | 视频相关网络逻辑层 |
0x03 WebRTC 架构图
0x04 WebRTC example 说明
// TODO