webrtc入门四-源码编译

455 阅读3分钟

写在前面:

本文修改了编译的版本、增加了安装虚拟机时的注意点。

操作系统:macos11.6

本文分三部分:

一、安装编译环境

二、下载源码

三、执行编译

对于M1芯片的mac,目前还没有研究解决办法,据说VirtualBox不能使用了。等我电脑到了研究一下再更新吧,废话到这里。


正文:

一、安装编译环境

首先我们需要下载并安装 VirtualBox;接着执行 brew install vagrant 安装 vagrant(基于 VirtualBox 搭建开发环境)。

新电脑安装brew:

/bin/bash -c "$(curl -fsSL raw.githubusercontent.com/Homebrew/in…)"

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ansion/.zprofile

eval "$(/opt/homebrew/bin/brew shellenv)"

然后执行如下命令:

创建并切换到 ~/vagrant 目录

mkdir ~/vagrant && cd "_"

初始化虚拟机(目前系统为 Ubuntu 18.04 LTS 64-bit)

$ vagrant init hashicorp/bionic64

启动这个虚拟机

$ vagrant up //这里使用mac需要授权,重启才能生效;

通过 ssh 连接到这个虚拟机

$ vagrant ssh

二、获取源码

$ git clone chromium.googlesource.com/chromium/to…

接着将如下命令加入到 ~/.bashrc 中,并输入 source ~/.bashrc 重载 bash。其中的 /path/to/ 需要你替换为 depot_tools 的所在路径:

export PATH=/path/to/depot_tools:$PATH

# 创建并切换到 ~/webrtc(也可以是自定义路径)

mkdir ~/webrtc && cd "_"

拉取并同步 WebRTC 的最新代码

$ fetch --nohooks webrtc_android

$ gclient sync

下载的代码包含正常的 WebRTC 分支和 Android 分支。Android 分支包含 SDK 和 NDK(大约 8GB),而所有代码大约 16GB。这份代码既可以被用来进行 Android 开发,也可以被用来进行正常的 Linux 开发。因为 WebRTC 使用 Ninja 作为其构建系统,你只需要在不同路径下生成不同的编译配置即可(当然这就是另一个话题了)。

相信你已经执行完上述所有流程了。此时你应该位于 WebRTC 的 master 分支,但我们一般不直接使用 master,而是应该切换到最近一个 release 版本。可以在这里获取到所有 release 信息。截止到本文撰写的时间,最新的 release 版本为 M89,我们用 (branch-heads/4389)。

可以从这里获取最新版本信息

# 下载的代码位于 ~/webrtc/src

$ cd ~/webrtc/src

创建一个新的分支 m88(注意一定要 sync)

$ git checkout -b m89 branch-heads/4389

$ gclient sync

# 切换到 master 分支

$ git checkout master

$ git pull origin master

$ gclient sync

切换回你自己的分支(有冲突的话自己解决)

$ git checkout my-branch

$ git merge master

三、源码编译:

# 安装编译 WebRTC 所需的依赖

$ ./build/install-build-deps.sh

$ ./build/install-build-deps-android.sh

-h 可以查看有哪些编译参数

$ ./tools_webrtc/android/build_aar.py -h

直接执行脚本,使用默认参数进行编译

$ ./tools_webrtc/android/build_aar.py

编译结果 libwebrtc.aar 默认位于 ~/webrtc/src 目录下,包含了 armeabi-v7a、arm64-v8a、x86 和 x86_64 四种架构的 .so(可以通过 -h 查看如何只编译指定架构的包)

编译可debug的so:

... template("android_clang_toolchain") { ... _prefix = rebase_path("clangbasepath/bin",rootbuilddir)cc="clang_base_path/bin", root_build_dir) cc = "_prefix/clang" cxx = "prefix/clang++"ar="_prefix/clang++" ar = "_prefix/llvm-ar" ld = cxx readelf = _tool_prefix + "readelf" nm = _tool_prefix + "nm"

注释掉下面两行配置,即可实现 unstrip

#strip = rebase_path("//buildtools/third_party/eu-strip/bin/eu-strip",

#root_build_dir) # use_unstripped_as_runtime_outputs = android_unstripped_runtime_outputs ... } ...

$ ./tools_webrtc/android/build_aar.py \
  --extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true" \
  --arch arm64-v8a

可以把你编译好的文件替换我这个工程的libs/libwebrtc.aar:gitee.com/hychzqyj/we…cp libwebrtc.aar /vagrant 将 libwebrtc.aar 拷贝到 /vagrant 目录,这个目录是虚拟机与宿主机(macOS)的共享文件目录,目录的名字是在第一步中初始化虚拟机目录的时候给的名字;

我这个项目默认用的手机双摄像头的本地回环,注意:

1,有些手机不支持同时打开前后摄像头。

2,需要你手动去开启相机权限。

-------------------

除了编译,还有一种方式可以帮助我们修改webrtc中的java代码:

这种方法分为两步:之后正常编译就可以了

1.把编译好的aar文件中的so复制到工程lib\arm64-v8a和lib\armeabi-v7a两个目录下;

2.把webrtc远吗目录下a\b\c\d\e的文件复制到工程src下的org/webrtc目录,然后没有问题正常编译就可以了:

a) 自动生成的文件

out/Debug/gen/sdk/android/peerconnection_java/generated_java/input_srcjars/org/webrtc

这个数量很少,只有如下三个:

NetworkPreference.java Priority.java VideoCodecType.java

b) sdk/android/src/java/     //音视频采集

c) sdk/android/api

d) rtc_base/java/src      //工具类(log、context、thread)

e) modules/audio_device/android/java/src

上面的文件全部拷贝到新模块的org/webrtc目录下

————————————————预祝编译成功----