在音视频领域,想深入研究的话,必定会接触WebRTC。WebRTC是一个庞大的工程,就像是音视频领域的百科全书,音视频采集,编解码,传输,渲染等一条龙在WebRTC里都有,而且WebRTC还有很多先进的音视频处理算法。由于WebRTC代码过于庞大,所以最好单步调试跟踪代码运行,这样才可以更好地学习WebRTC,否则很难有头绪。工欲善其事必先利其器,作为调试神器,宇宙第一IDE Visual Studio必不可少。所以本篇文章主要讲下如何在Windows上编译WebRTC,同时得到VS工程,然后调试。
很早以前写过VS2017上的编译,不过那篇文章有点跟不上时代,因为WebRTC用到的编译工具以及版本总是变化的,所以另开此文章,同步更新Windows平台最新编译步骤。
本文内容截止2020.08.24,最新代码测试编译通过
系统要求
- Win7及以上64位系统。
- 内存至少8G,当然越大越好。
- 100G磁盘空间(NTFS格式),不能是FAT32,因为会生成大于4G的文件。
Visual Studio安装
这里我们选择最新的VS2019,我用的是社区版。安装VS2019时选择自定义安装,必须勾选如下几项:
- Desktop development with C++组件中10.0.19041或以上的Win10 SDK(如果没看到该版本,去左侧可选组件那里勾选),后面还要安装调试工具
- Desktop development with C++组件中MFC以及ATL这两项
安装完VS2019后,必须安装SDK调试工具。打开控制面板->程序与功能,找到刚才安装的最新Windows Software Development Kit,鼠标右键->change。
勾选Debugging Tools For Windows,然后点击change。
depot_tools安装
下载depot_tools然后解压到某个目录,比我的解压到E盘根目录。接着将该depot_tools目录的路径加到系统环境变量Path里,然后把该路径移到最前面(避免已安装的python与git造成影响)。
获取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,就不用这样设置了,这里推荐使用VPN,过程会比较顺畅。
接着执行gclient
命令,安装编译需要用到的一些工具,比如git以及python。
1 |
gclient |
再接着设置一些环境变量,设置下我们的VS安装路径,由于我用的社区版,所以路径名后缀是Community,其他VS版本可按实际修改。
1 2 3 4 5 6 |
set vs2019_install=D:\Program Files (x86)\Microsoft Visual Studio\2019\Community set GYP_MSVS_OVERRIDE_PATH=D:\Program Files (x86)\Microsoft Visual Studio\2019\Community set GYP_GENERATORS=msvs-ninja,ninja set WINDOWSSDKDIR=D:\Windows Kits\10 # 告诉depot_tools使用我们本机的VS进行编译 set DEPOT_TOOLS_WIN_TOOLCHAIN=0 |
然后cd到要放源码的地方(要遵守前面说的磁盘要求),执行:
1 2 3 4 |
mkdir webrtc-checkout cd webrtc-checkout fetch --nohooks webrtc gclient sync |
这一过程是个漫长的等待,要下的东西将近10G,包括源码,第三方库,以及一些测试的音视频文件资源等,如果因为网络等原因中断了,就再执行gclient sync
。如果这一步一直卡着不动,可以执行ctrl+c
,然后执行gclient sync
。
编译
生成VS2019工程文件:
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 |
用VS2019打开:
可以看到众多工程,到此算是完成了。找到我们感兴趣的,就可以用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.https://webrtc.org/native-code/development/.
[2] Chromium’s build instructions for Windows.https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md.
文章评论
@jeff 大佬,求一份工程, 2749048950@qq.com
@annlee 依赖太多,还是靠自己编译吧
@Jeff 主要是翻墙更新太慢了,老断,下不下来,ss的老被禁,其他的还好
@annlee 推荐使用V-P-N再编译,我用的https://www.ex防止屏蔽pressv防止屏蔽pn.com/(去掉中间汉字) 这个,速度很快
@Jeff https://www.ex防止屏蔽pressv防止屏蔽pn.com/
这个打不开呢
@sss 这种网站肯定被屏蔽了
@Jeff ok
3Q作者,我也是今天在WIN下编译的:
遇到的坑全靠作者文章;
也是遇到vs_toolchain.py问题; cmd下set不太行,也懒得每次同步后改他py;
看了看他运行PY是os.env取;
我是在: 环境变量->系统变量->直接新建变量名:vs2019_install; 变量值:C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise;解决;
@thank作者 不客气
D:\workspace\c++\opensource\other\webrtc-code\webrtc>gclient sync
kernel32.SetConsoleMode to enable ANSI sequences failed
Syncing projects: 100% ( 1/ 1) src
src (ERROR)
----------------------------------------
[0:00:00] Started.
[0:00:00]
Traceback (most recent call last):
File "E:\tools\depot_tools\gclient_scm.py", line 1043, in _Clone
self._Run(clone_cmd, options, cwd=self._root_dir, retry=True,
File "E:\tools\depot_tools\gclient_scm.py", line 1411, in _Run
gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
File "E:\tools\depot_tools\gclient_utils.py", line 634, in CheckCallAndFilter
show_header_if_necessary(needs_header, attempt)
File "E:\tools\depot_tools\gclient_utils.py", line 567, in show_header_if_necessary
stdout_write(header.encode())
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 41, in write
self.__convertor.write(text)
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 162, in write
self.write_and_convert(text)
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 184, in write_and_convert
text = self.convert_osc(text)
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 246, in convert_osc
for match in self.ANSI_OSC_RE.finditer(text):
TypeError: cannot use a string pattern on a bytes-like object
[0:00:01] _____ removing non-empty tmp dir D:\workspace\c++\opensource\other\webrtc-code\webrtc\_gcl
----------------------------------------
Traceback (most recent call last):
File "E:\tools\depot_tools\metrics.py", line 267, in print_notice_and_exit
yield
File "E:\tools\depot_tools\gclient.py", line 3195, in <module>
sys.exit(main(sys.argv[1:]))
File "E:\tools\depot_tools\gclient.py", line 3181, in main
return dispatcher.execute(OptionParser(), argv)
File "E:\tools\depot_tools\subcommand.py", line 252, in execute
return command(parser, args[1:])
File "E:\tools\depot_tools\gclient.py", line 2737, in CMDsync
ret = client.RunOnDeps('update', args)
File "E:\tools\depot_tools\gclient.py", line 1779, in RunOnDeps
work_queue.flush(revision_overrides, command, args, options=self._options,
File "E:\tools\depot_tools\gclient_utils.py", line 965, in flush
reraise(e[0], e[1], e[2])
File "E:\tools\depot_tools\gclient_utils.py", line 67, in reraise
raise value
File "E:\tools\depot_tools\gclient_utils.py", line 1042, in run
self.item.run(*self.args, **self.kwargs)
File "E:\tools\depot_tools\gclient.py", line 925, in run
self._got_revision = self._used_scm.RunCommand(command, options, args,
File "E:\tools\depot_tools\gclient_scm.py", line 132, in RunCommand
return getattr(self, command)(options, args, file_list)
File "E:\tools\depot_tools\gclient_scm.py", line 546, in update
self._Clone(revision, url, options)
File "E:\tools\depot_tools\gclient_scm.py", line 1043, in _Clone
self._Run(clone_cmd, options, cwd=self._root_dir, retry=True,
File "E:\tools\depot_tools\gclient_scm.py", line 1411, in _Run
gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
File "E:\tools\depot_tools\gclient_utils.py", line 634, in CheckCallAndFilter
show_header_if_necessary(needs_header, attempt)
File "E:\tools\depot_tools\gclient_utils.py", line 567, in show_header_if_necessary
stdout_write(header.encode())
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 41, in write
self.__convertor.write(text)
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 162, in write
self.write_and_convert(text)
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 184, in write_and_convert
text = self.convert_osc(text)
File "E:\tools\depot_tools\third_party\colorama\ansitowin32.py", line 246, in convert_osc
for match in self.ANSI_OSC_RE.finditer(text):
TypeError: cannot use a string pattern on a bytes-like object
项目前面都有个红色图标,应该是有问题了吧?
@hyt_tony 应该是 git 状态,ignore
@hyt_tony Use
git status
to see what you have changed您好,我在生成工程文件的那一步一直遇到问题请问这种情况应该怎么办呀
E:\company\webrtc-checkout\src>gn gen --ide=vs out/Default
Traceback (most recent call last):
File "E:/company/webrtc-checkout/src/build/vs_toolchain.py", line 577, in <module>
sys.exit(main())
File "E:/company/webrtc-checkout/src/build/vs_toolchain.py", line 573, in main
return commands[sys.argv[1]](*sys.argv[2:])
File "E:/company/webrtc-checkout/src/build/vs_toolchain.py", line 387, in CopyDlls
_CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True)
File "E:/company/webrtc-checkout/src/build/vs_toolchain.py", line 360, in _CopyRuntime
_CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix)
File "E:/company/webrtc-checkout/src/build/vs_toolchain.py", line 321, in _CopyUCRTRuntime
os.path.join(source_dir, 'ucrtbase' + suffix))
File "E:/company/webrtc-checkout/src/build/vs_toolchain.py", line 221, in _CopyRuntimeImpl
abs(os.stat(target).st_mtime - os.stat(source).st_mtime) >= 0.01)):
WindowsError: [Error 3] : 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\ucrt\\ucrtbased.dll'
ERROR at //build/toolchain/win/BUILD.gn:49:3: Script returned non-zero exit code.
exec_script("../../vs_toolchain.py",
^----------
Current dir: E:/company/webrtc-checkout/src/out/Default/
Command: D:/code/depot_tools/bootstrap-3_8_0_chromium_8_bin/python/bin/python.exe E:/company/webrtc-checkout/src/build/vs_toolchain.py copy_dlls E:/company/webrtc-checkout/src/out/Default Debug x64
Returned 1.
See //BUILD.gn:29:3: which caused the file to be included.
group("default") {
^-----------------
Traceback (most recent call last):
File "E:/company/webrtc-checkout/src/build/toolchain/win/setup_toolchain.py", line 304, in <module>
main()
File "E:/company/webrtc-checkout/src/build/toolchain/win/setup_toolchain.py", line 257, in main
vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')
File "E:/company/webrtc-checkout/src/build/toolchain/win/setup_toolchain.py", line 211, in FindFileInEnvList
file_name, env_name, '\n'.join(parts))
AssertionError: user32.lib is not found in LIB:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\ATLMFC\lib\x64
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64
C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64
Check if it is installed.
@qsz 检查下Win10 SDK是否正确安装
换了一下代理
set vs2019_install=D:\Program Files (x86)\Microsoft Visual Studio\2019\Community
set GYP_MSVS_OVERRIDE_PATH=D:\Program Files (x86)\Microsoft Visual Studio\2019\Community
set GYP_GENERATORS=msvs-ninja,ninja
set WINDOWSSDKDIR=D:\Windows Kits\10
tips: 第二行community多打了一个空格,直接复制的话会出现奇怪的错误...
PS: 如果Windows Software Development Kit安装不了Debugging Tools For Windows(我加载不了,开了VPN也没用)可以去官网下载 https://software-download.microsoft.com/download/pr/19041.685.201201-2105.vb_release_svc_prod1_WindowsSDK.iso 然后解压到路径:Windows Kits\10
@thanks 作者 安装到该路径...不是解压
怎么没有Desktop development with C++组件中10.0.19041或以上的Win10 SDK
Windows 10 SDK (10.0.18362.0) 只有这个可以吗?
vs2019 16.8.3的版本 好像自带的是10.0.18362.0, 不是10.0.19041。 必须要装10.0.19041 吗?
你们运行example 下peerconnection_client.exe 有没有遇到崩溃
#
# Fatal error in: ../../modules/video_capture/windows/sink_filter_ds.cc, line 724
# last system error: 0
# Check failed: (&capture_checker_)->IsCurrent()
#
@ziqzhang 检查摄像头是不是被占用了之类问题
我编译的m79版本,用VS2019打开会报错,
F:\git\webrtc_build_win\webrtc\src\modules/video_coding/codecs/h264/h264_color_space.h(20): fatal error C1189: #error: "See: bugs.webrtc.org/9213#c13."
好像是因为window上ffmpeg是用clang编译导致的
这个用什么办法解决呢?
@haige M79是2019年发布的版本,不适用这篇文章。编译M79时,
gclient
工具也得更新到对应日期时的版本。