剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. WebRTC
  3. 正文

Windows平台WebRTC编译(持续更新)

2020年8月11日 605点热度 3人点赞 29条评论

在音视频领域,想深入研究的话,必定会接触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.

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: WebRTC
最后更新:2020年12月21日

Jeff Young

代码为剑,如痴如醉

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • annlee

    @jeff 大佬,求一份工程, 2749048950@qq.com

    2020年8月21日
    回复
    • Jeff

      @annlee 依赖太多,还是靠自己编译吧

      2020年8月22日
      回复
      • annlee

        @Jeff 主要是翻墙更新太慢了,老断,下不下来,ss的老被禁,其他的还好

        2020年8月24日
        回复
        • Jeff

          @annlee 推荐使用V-P-N再编译,我用的https://www.ex防止屏蔽pressv防止屏蔽pn.com/(去掉中间汉字) 这个,速度很快

          2020年8月24日
          回复
          • sss

            @Jeff https://www.ex防止屏蔽pressv防止屏蔽pn.com/

            这个打不开呢

            2020年9月8日
            回复
            • Jeff

              @sss 这种网站肯定被屏蔽了

              2020年9月9日
              回复
      • annlee

        @Jeff ok

        2020年8月24日
        回复
  • thank作者

    3Q作者,我也是今天在WIN下编译的:
    遇到的坑全靠作者文章;
    也是遇到vs_toolchain.py问题; cmd下set不太行,也懒得每次同步后改他py;
    看了看他运行PY是os.env取;
    我是在: 环境变量->系统变量->直接新建变量名:vs2019_install; 变量值:C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise;解决;

    2020年8月29日
    回复
    • Jeff

      @thank作者 不客气 :cool:

      2020年8月30日
      回复
  • isjk

    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

    2020年9月10日
    回复
  • hyt_tony

    项目前面都有个红色图标,应该是有问题了吧?

    2020年10月6日
    回复
    • test_user

      @hyt_tony 应该是 git 状态,ignore

      2020年10月14日
      回复
    • Jeff

      @hyt_tony Use git status to see what you have changed

      2020年10月21日
      回复
  • qsz

    您好,我在生成工程文件的那一步一直遇到问题请问这种情况应该怎么办呀
    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.

    2020年11月1日
    回复
    • Jeff

      @qsz 检查下Win10 SDK是否正确安装

      2020年11月1日
      回复
  • Yoann

    换了一下代理

    2020年12月14日
    回复
  • thanks 作者

    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多打了一个空格,直接复制的话会出现奇怪的错误...

    2020年12月21日
    回复
  • thanks 作者

    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

    2020年12月21日
    回复
    • thanks 作者

      @thanks 作者 安装到该路径...不是解压

      2020年12月21日
      回复
  • ziqzhang

    怎么没有Desktop development with C++组件中10.0.19041或以上的Win10 SDK

    Windows 10 SDK (10.0.18362.0) 只有这个可以吗?

    2020年12月23日
    回复
  • ziqzhang

    vs2019 16.8.3的版本 好像自带的是10.0.18362.0, 不是10.0.19041。 必须要装10.0.19041 吗?

    2020年12月23日
    回复
  • ziqzhang

    你们运行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()
    #

    2021年1月4日
    回复
    • Jeff

      @ziqzhang 检查摄像头是不是被占用了之类问题

      2021年1月4日
      回复
  • haige

    我编译的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编译导致的

    这个用什么办法解决呢?

    2021年1月15日
    回复
    • Jeff

      @haige M79是2019年发布的版本,不适用这篇文章。编译M79时,gclient工具也得更新到对应日期时的版本。

      2021年1月16日
      回复
  • 取消回复

    我的其它小窝

    公众号:码上Play(基本不更新,回答问题用)

    近期评论
    • Jeff on WebRTC研究:BBR拥塞控制被移除了研究过了,等后面有时间简单说明下
    • xhcx on WebRTC研究:BBR拥塞控制被移除了楼主,BBR移除的原因最近有研究吗,分享一下
    • Jeff on Windows平台WebRTC编译(持续更新)M79是2019年发布的版本,不适用这篇文章。编译…
    • haige on Windows平台WebRTC编译(持续更新)我编译的m79版本,用VS2019打开会报错, F…
    • 菜菜 on libcef编译使用--使用VS2015是真的鸟
    版权声明

    为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

    目录
    • 1 系统要求
    • 2 Visual Studio安装
    • 3 depot_tools安装
    • 4 获取WebRTC源码
    • 5 编译
    • 6 代码更新
    • 7 引用WebRTC库
    • 8 总结
    • 9 参考
    相关文章推荐
    • WebRTC研究:Simulcast层数变化
    • WebRTC研究:RTP头部扩展
    • WebRTC研究:音频带内FEC
    • WebRTC研究:BBR拥塞控制被移除了
    • WebRTC安卓编译

    COPYRIGHT © 2021 剑痴乎. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS