0%

Windows平台WebRTC编译-VS2017

在音视频领域,想深入研究的话,必定会接触WebRTC。WebRTC是一个庞大的工程,就像是音视频领域的百科全书,音视频采集,编解码,传输,渲染等一条龙在WebRTC里都有,而且WebRTC还有很多先进的音视频处理算法。由于WebRTC代码过于庞大,所以最好单步调试跟踪代码运行,这样才可以更好地学习WebRTC,否则很难有头绪。工欲善其事必先利其器,作为调试神器,宇宙第一IDE Visual Studio必不可少。所以本篇文章主要讲下如何在Windows上编译WebRTC,同时得到VS工程,然后调试。

本文内容截止2020.04.01,最新代码测试编译通过

系统要求

  • Win7及以上64位系统。
  • 内存至少8G,当然越大越好。
  • 100G磁盘空间(NTFS格式),不能是FAT32,因为会生成大于4G的文件。

Visual Studio安装

WebRTC用到了很多C++最新特性,所以编译最新WebRTC代码VS要求为2017(>=15.7.2) 版本。我用的是VS2017社区版(VS新老版本下载)。VS最好安装在C盘,按默认路径安装,否则可能遇到问题(见问题0x02)。安装VS2017时选择自定义安装,必须勾选如下几项:

  • Desktop development with C++组件中10.0.18362或以上的Win10 SDK,后面还要安装调试工具
  • Desktop development with C++组件中MFC以及ATL这两项

2020.04.01更新:由于最新WebRTC源码要求10.0.18362及以上Win10 SDK。所以请下载10.0.18362 或以上的Win10 SDK。本文写于2019年,那时VS2019还没发布。由于10.0.18362 Win10 SDK存在于VS2019安装选项中,VS2017安装选项不带有该SDK,所以使用VS2017得从Win10 SDK下载另外下载最新Win10 SDK,或者再装个VS2019选择安装该SDK

安装完VS2017后,必须安装SDK调试工具。打开控制面板->程序与功能,找到刚才安装的最新Windows Software Development Kit,鼠标右键->change。
alt SDK change

勾选Debugging Tools For Windows,然后点击change。
alt SDK change

depot_tools安装

下载depot_tools然后解压到某个目录,比我的解压到E盘根目录。接着将该depot_tools目录的路径加到系统环境变量Path里,然后把该路径移到最前面(避免已安装的python与git造成影响)。
alt depottool

然后新建一个系统环境变量: DEPOT_TOOLS_WIN_TOOLCHAIN ,值设置为0,这是为了告诉depot_tools使用我们本机的VS进行编译。
alt depottool

获取WebRTC源码

由于WebRTC的源码地址被墙了,所以需要通过代理或者vpn才能得到源码。后面都是命令行操作,打开cmd窗口,由于我用的是ss代理,在cmd窗口我按如下设置:

1
2
set http_proxy=127.0.0.1:1080
set https_proxy=127.0.0.1:1080

设置当前cmd窗口代理上网,如果cmd窗口关闭了重开得重新设置。当然了,也可以设置系统全局代理上网。其他代理方法也类似。如果是VPN之类非代理,就不用这样设置了。

接着执行gclient命令,安装编译需要用到的一些工具,比如git以及python。

1
gclient

再接着设置一些环境变量。

1
2
3
set vs2017_install=D:\Program Files (x86)\Microsoft Visual Studio\2017\Community
set GYP_MSVS_OVERRIDE_PATH=D:\Program Files (x86)\Microsoft Visual Studio\2017\Community
set GYP_GENERATORS=msvs-ninja,ninja

其中GYP_MSVS_OVERRIDE_PATH是我们安装的VS2017路径。

然后cd到要放源码的地方(要遵守前面说的磁盘要求),执行:

1
2
3
4
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync

这一过程是个漫长的等待,要下的东西将近10G,包括源码以及一些测试的音视频文件资源等,如果因为网络等原因中断了,就再gclient sync

使用gclient sync可能遇到的问题

问题0x01

1
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)

Unicode字符编码问题,python的一个bug,因为很多人系统语言都是中文的,所以得按如下设置,把系统区域改为英文,然后重启即可。
alt webrtcbuild

问题0x02

2019.04.01更新。去年的版本我编译时没报这个问题,我看到评论里有人提出来了,我下了今天的最新代码,编译时也碰到了,看了下是最新WebRTC windows相关脚本变化导致

Exception: No supported Visual Studio can be found. Supported versions are: 16.0 (2019), 15.0 (2017)错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Traceback (most recent call last):
File "src/tools/clang/scripts/update.py", line 383, in <module>
sys.exit(main())
File "src/tools/clang/scripts/update.py", line 379, in main
return UpdatePackage(args.package)
File "src/tools/clang/scripts/update.py", line 313, in UpdatePackage
CopyDiaDllTo(os.path.join(LLVM_BUILD_DIR, 'bin'))
File "src/tools/clang/scripts/update.py", line 247, in CopyDiaDllTo
GetWinSDKDir()
File "src/tools/clang/scripts/update.py", line 222, in GetWinSDKDir
msvs_version = vs_toolchain.GetVisualStudioVersion()
File "D:\webrtc-checkout\src\build\vs_toolchain.py", line 165, in GetVisualStudioVersion
' Supported versions are: %s.' % supported_versions_str)
Exception: No supported Visual Studio can be found. Supported versions are: 16.0 (2019), 15.0 (2017).
Error: Command 'vpython.bat src/tools/clang/scripts/update.py' returned non-zero exit status 1 in D:\webrtc-checkout
Hook 'vpython.bat src/tools/clang/scripts/update.py' took 44.30 secs

解决方法为修改src\build目录下的vs_toolchain.py脚本,加了一行,直接写死我们的VS路径代码:

1
2
3
4
5
6
7
8
9
10
11
12
diff --git a/vs_toolchain.py b/vs_toolchain.py
index c2ad5c02f..3db2d3c41 100755
--- a/vs_toolchain.py
+++ b/vs_toolchain.py
@@ -153,6 +153,7 @@ def GetVisualStudioVersion():
for version in supported_versions:
for path in (
os.environ.get('vs%s_install' % version),
+ os.path.expandvars('D:/Program Files (x86)/Microsoft Visual Studio/%s' % version),
os.path.expandvars('%ProgramFiles(x86)%' +
'/Microsoft Visual Studio/%s' % version)):
if path and any(os.path.exists(os.path.join(path, edition)) for edition in

脚本中的代码默认以C盘处理的,如果我们的VS安装在C盘默认目录就不会报这个错,但我想很多人VS不会装在C盘。

执行:python src/build/vs_toolchain.py get_toolchain_dir验证修改,控制台打印如下:

1
2
3
4
5
vs_path = "D:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community"
sdk_path = "C:\\Program Files (x86)\\Windows Kits\\10"
vs_version = "2017"
wdk_dir = ""
runtime_dirs = "C:\\WINDOWS\\System32;C:\\WINDOWS\\SysWOW64;Arm64Unused"

说明修改成功。接着我们使用gclient sync会报如下问题:

1
2
3
4
5
6
7
8
9
10
11
src/build (ERROR)
----------------------------------------
[0:00:00] Started.
[0:00:00] Finished running: git config remote.origin.url
[0:00:00] Finished running: git rev-list -n 1 HEAD
[0:00:00] Finished running: git rev-parse --abbrev-ref=strict HEAD
----------------------------------------
Error: 3>
3> ____ src\build at 2c249ccb22f58faae38342331925f657a49a9de8
3> You have unstaged changes.
3> Please commit, stash, or reset.

因为我们修改了脚本,所以执行gclient sync --force即可。

gclient sync --force成功结束后,vs_toolchain.py文件会被还原,所以得按前面重新修改vs_toolchain.py。vs_toolchain.py中会优先选择高版本VS编译,由于本文使用VS2017编译,假如我们电脑安装有VS2019,需要按如下修改,把VS2017放前面,避免造成影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
diff --git a/vs_toolchain.py b/vs_toolchain.py
index c2ad5c02f..9572acd2b 100755
--- a/vs_toolchain.py
+++ b/vs_toolchain.py
@@ -25,8 +25,8 @@ json_data_file = os.path.join(script_dir, 'win_toolchain.json')

# VS versions are listed in descending order of priority (highest first).
MSVS_VERSIONS = collections.OrderedDict([
- ('2019', '16.0'),
('2017', '15.0'),
+ ('2019', '16.0'),
])

# List of preferred VC toolset version based on MSVS

编译

生成VS2017工程文件:

1
2
 cd src
gn gen --ide=vs out/Default

可以在src\out\Default\ 下得到 all.sln解决方案文件。

如果不想使用默认编译参数,可以使用gn args out/Default --list查看当前编译参数,通过类似如下方式设置:

1
gn gen -ide=vs out/Default --args=“use_rtti=true is_clang=false rtc_build_tools=false rtc_include_tests=false rtc_build_examples=false”

执行编译命令:

1
ninja -C out/Default

alt webrtcbuilf

用VS2017打开:
alt webrtcbuild

可以看到众多工程,到此算是完成了。找到我们感兴趣的,就可以用VS单步调试,跟踪代码运行了。这么多宝贝够研究很久了。

代码更新

1
2
3
git checkout master
git pull origin master
gclient sync

引用WebRTC库

WebRTC编译后会在src\out\Default\obj目录下生成整个WebRTC工程的静态库:webrtc.lib,链接下这个就可以了。

总结

总之WebRTC在Windows上的编译很考验耐心,也很苛刻,需要电脑性能够好,有个好的访问被墙地址工具。

参考

  1. WebRTC Native code Development
  2. WebRTC Native code Development