Skip to content

WebRTC下载与编译 Mac

更新日期: 2022-4-28
  • 2022-4-28 报错记录
  • 2022-4-24 编译mac版本
  • 2022-4-18 增加编译过程
  • 2022-4-14 更新版本
  • 2022-4-13 创建文档

WebRTC能让web应用和站点之间选择性地分享音视频流。在不安装其它应用和插件的情况下,完成点对点通信。 WebRTC背后的技术被实现为一个开放的Web标准,并在所有主要浏览器中均以常规JavaScript API的形式提供。对于客户端(例如Android和iOS),可以使用提供相同功能的库。 WebRTC是个开源项目,得到Google,Apple,Microsoft和Mozilla等等公司的支持。2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准。

本文介绍下载编译WebRTC的过程。

开发环境:

  • macOS Big Sur 11.4
  • Xcode 13.2.1

下载WebRTC

首先需要一个良好的网络环境。我们需要连接到Google,一个良好稳定的网络环境能事半功倍。一方面是下载代码,另一方面可能要重装Xcode。

其次磁盘上留出约25G的空间。WebRTC下载完成后,约占用16G。编译后会占用更多的空间,占用超过20G。

使用终端,创建并进入目录 ~/ws/webrtc-proj

网络环境

准备网络环境。打开工具,然后配置端口。端口因工具而异。请务必使用一个稳定的工具

export http_proxy=localhost:7890
export https_proxy=localhost:7890

先来准备工具depot_tools

depot_tools

从googlesource下载depot_tools

~/ws/webrtc-proj $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

depot_tools大约占用500M空间

配置环境变量,执行

~/ws/webrtc-proj $ export PATH=$(pwd)/depot_tools:$PATH

或者把路径添加到.bashrc里。然后要读取一次配置或者新建终端。

export PATH=/Users/rustfisher/ws/webrtc/depot_tools:$PATH

输入ninja -h,如果能执行表明环境变量设置OK

ninja -h
usage: ninja [options] [targets...]

if targets are unspecified, builds the 'default' target (see manual).

下载

depot_tools下载并且设置完毕。接下来我们下载WebRTC工程。需要用到fetch和gclient命令。

首先新建一个目录webrtc,进入这个目录

mkdir webrtc
cd webrtc

然后获取代码,开始同步

fetch --nohooks webrtc_ios
gclient sync

如果网速能达到20M,2个小时内代码可以下载完成

我们默认下载的是最新的源码,如果想要切换到指定分支,可以使用以下命令:

# 查看可用版本分支
git branch -r
# 切换到main分支
git checkout origin/main
gclient sync

或者强制切换到指定commit

# 或者强制切换到指定commit(b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b是m79最后一次提交的commit id)
gclient sync -r b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b --force

下载得到的工程在~/ws/webrtc-proj/webrtc/src

其他镜像

如果用声网镜像,还是gitee,gitlab的镜像,可能会遇到EOF之类的问题。 如果有良好的上网工具,推荐还是从Google下载。

使用其他镜像时,遇到过很多问题,比如remote error

remote error
src/third_party/catapult (ERROR)
----------------------------------------
[0:00:39] Started.
[0:00:39] Finished running: git config remote.origin.url
[0:00:39] Finished running: git rev-list -n 1 HEAD
[0:00:39] Finished running: git rev-parse --abbrev-ref=strict HEAD
fatal: remote error: upload-pack: not our ref 5ff11ff500b8af289afe5f1f298bc0e4f7c454f4
[0:00:46] fatal: remote error: upload-pack: not our ref 5ff11ff500b8af289afe5f1f298bc0e4f7c454f4
[0:00:49] fatal: remote error: upload-pack: not our ref 5ff11ff500b8af289afe5f1f298bc0e4f7c454f4
[0:00:54] fatal: remote error: upload-pack: not our ref 5ff11ff500b8af289afe5f1f298bc0e4f7c454f4
----------------------------------------
Error: Command 'git -c core.deltaBaseCacheLimit=4g fetch origin 5ff11ff500b8af289afe5f1f298bc0e4f7c454f4 --no-tags' returned non-zero exit status 128 in /Users/rustfisher/Desktop/ws/webrtc-proj/webrtc/src/third_party/catapult

或者usrsctp/usrsctplib遇到错误

usrsctp/usrsctplib遇到错误
Error: Command 'git -c core.deltaBaseCacheLimit=4g fetch origin 22ba62ffe79c3881581ab430368bf3764d9533eb --no-tags' returned non-zero exit status 128 in /Users/rustfisher/Desktop/ws/webrtc-proj/webrtc/src/third_party/usrsctp/usrsctplib

当时的解决办法就是不断的重新gclient sync。但并不能完全解决这个问题。

用一个好的工具可以避免这些问题。

编译

main分支

编译之前,建议切换到main分支。

$ git checkout remotes/origin/main

$ git branch 
* (头指针在 origin/main 分离)
  main

$ gclient sync

Xcode相当于最新版的,我们的WebRTC代码也选择比较新的版本。 如果选择以前的分支,会出现工具与代码对不上的情况,不停的报错。

编译旧分支报错

编译旧分支不停地报错 ninja -C out/Default

../../third_party/llvm-build/Release+Asserts/bin/../include/c++/v1/math.h:769:12: error: no member named 'labs' in the global namespace; did you mean 'abs'?
return ::labs(__x);
        ~~^
../../third_party/llvm-build/Release+Asserts/bin/../include/c++/v1/math.h:768:39: note: 'abs' declared here
inline _LIBCPP_INLINE_VISIBILITY long abs(long __x) _NOEXCEPT {
                                    ^
../../third_party/llvm-build/Release+Asserts/bin/../include/c++/v1/math.h:773:12: error: no member named 'llabs' in the global namespace
return ::llabs(__x);
        ~~^
../../third_party/llvm-build/Release+Asserts/bin/../include/c++/v1/math.h:781:12: error: no member named 'fabsf' in the global namespace
return ::fabsf(__lcpp_x);

编译iOS版本

使用WebRTC提供的脚本来编译

$ ./tools_webrtc/ios/build_ios_libs.sh

编译结果在out_ios_libs

编译mac版本

使用默认的编译方法编译mac版本

~/ws/webrtc-proj/webrtc/src $ gn gen out/Default
Done. Made 1570 targets from 291 files in 1336ms

~/ws/webrtc-proj/webrtc/src $ ninja -C out/Default
ninja: Entering directory `out/Default'

编译得到的Default目录占用7G以上空间。

可以直接运行AppRTCMobile.app起来。

参考

作者: rustfisher.com | rf.cs@foxmail.com
示例: AndroidTutorial Gitee, Tutorial Github
本文链接: https://www.an.rustfisher.com/webrtc/intro/sync-build/
一家之言,仅当抛砖引玉。如有错漏,还请指出。如果喜欢本站的内容,还请支持作者。也可点击1次下方的链接(链接内容与本站无关),谢谢支持服务器