【WebRTC研究(1)】Windows编译WebRTC(声网教程补充篇)

写在前面的话

WebRTC下载编译的困难想必都很清楚了。我试图写一篇尽可能详细的编译手册,旨在帮助大家减少不必要的时间浪费。

鉴于WebRTC更新太快,所以网上很多编译方法都失效了,所以如果你看到是几年前的文章,就没必要较真了。本文基于声网提供的国内镜像,写作时间为2019年10月16日,WebRTC为2019年5月16日版本。诸君参考。

本文快速阅读方法

  • 10.0.17134 或以上的Win10 SDK
  • git为gitlab账号
  • 遇到“不是内部或外部命令,也不是可运行的程序”错误,找到工具所在目录,并添加到环境变量path里面,重启一下电脑就解决了
  • 其余参考声网教程https://webrtc.org.cn/mirror/

WebRTC发展历史

WebRTC的大名,在音视频领域的朋友想必都听过了。集音视频采集、编解码、传输、渲染于一身,其中音频降噪模块,尤为优秀。能看到这篇文章的,肯定也是准备研究一番了。不敢保证未来能否取代Flash,成为浏览器端的统一解决方案,至少目前来看,是这样的。

安装编译

本文使用了声网提供的国内镜像,并主要参考了它的编译指南。但因为写的过于简略,笔者在编译时还是遇到了很多问题。所以,本文编写目的也是对其作一些补充说明。默认读者是小小小小白,高手请绕行。

准备条件

  • Win7及以上64位操作系统(笔者使用Win10)
  • 内存8G以上,当然越大越好
  • 30G以上的存储空间,不能是FAT32格式,因为会产生大于4G的文件。

Visual Studio安装(如不需要,请忽略)

在Windows下开发,离不开宇宙第一IDE——Vsiual Studio,即使网上有人说它不好用。WebRTC的编译需要2017及以上版本,因为会用到C++11、C++14的很多新特性。安装时选择自定义安装,必须勾选如下几项:

  • 10.0.17134 或以上的Win10 SDK
  • MFC以及ATL这两项

其他根据需要选择。下图是我的安装选项

如果VS版本过低,找不到10.0.17134,则需要手动下载安装包下载地址。我在这里浪费了很多时间。

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

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


以下部分严重学习了声网的教程(原文地址)。同时,考虑到声网可能会有更新,所以我只做一些必要的补充。以下配置通过cmd命令窗口输入,注意使用管理员权限。

环境配置

  1. 配置gitlab账号。注意,是gitlab账号,不是github账号。

    git config --global user.email "[email protected]" 
    git config --global user.name "username"
    
  2. 设置VS编译的环境变量

    set GYP_MSVS_VERSION=2017
    set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
    set GYP_GENERATORS=msvs-ninja,ninja
    

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

  3. 替换git镜像仓库地址

    git config --global url.http://120.92.49.206:3232/chromiumsrc/webrtc.git.insteadOf https://chromium.googlesource.com/external/webrtc.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/base.git.insteadOf https://chromium.googlesource.com/chromium/src/base
    git config --global url.http://120.92.49.206:3232/chromiumsrc/build.git.insteadOf https://chromium.googlesource.com/chromium/src/build
    git config --global url.http://120.92.49.206:3232/chromiumsrc/buildtools.git.insteadOf https://chromium.googlesource.com/chromium/src/buildtools
    git config --global url.http://120.92.49.206:3232/chromiumsrc/gradle.git.insteadOf https://chromium.googlesource.com/external/github.com/gradle/gradle.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/ios.git.insteadOf https://chromium.googlesource.com/chromium/src/ios.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/testing.git.insteadOf https://chromium.googlesource.com/chromium/src/testing
    git config --global url.http://120.92.49.206:3232/chromiumsrc/third_party.git.insteadOf https://chromium.googlesource.com/chromium/src/third_party
    git config --global url.http://120.92.49.206:3232/chromiumsrc/clang-format.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libcxx.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/libcxx.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libcxxabi.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libunwind.git.insteadOf https://chromium.googlesource.com/external/llvm.org/libunwind.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/android_ndk.git.insteadOf https://chromium.googlesource.com/android_ndk.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/android_tools.git.insteadOf https://chromium.googlesource.com/android_tools.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/auto.git.insteadOf https://chromium.googlesource.com/external/github.com/google/auto.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/catapult.git.insteadOf https://chromium.googlesource.com/catapult.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/compact_enc_det.git.insteadOf https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/colorama.git.insteadOf https://chromium.googlesource.com/external/colorama.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/depot_tools.git.insteadOf https://chromium.googlesource.com/chromium/tools/depot_tools.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/errorprone.git.insteadOf https://chromium.googlesource.com/chromium/third_party/errorprone.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/ffmpeg.git.insteadOf https://chromium.googlesource.com/chromium/third_party/ffmpeg.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/findbugs.git.insteadOf https://chromium.googlesource.com/chromium/deps/findbugs.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/freetype2.git.insteadOf https://chromium.googlesource.com/chromium/src/third_party/freetype2.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/harfbuzz.git.insteadOf https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/gtest-parallel.git.insteadOf https://chromium.googlesource.com/external/github.com/google/gtest-parallel
    git config --global url.http://120.92.49.206:3232/chromiumsrc/googletest.git.insteadOf https://chromium.googlesource.com/external/github.com/google/googletest.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/icu.git.insteadOf https://chromium.googlesource.com/chromium/deps/icu.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/jsr-305.git.insteadOf https://chromium.googlesource.com/external/jsr-305.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/jsoncpp.git.insteadOf https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/junit.git.insteadOf https://chromium.googlesource.com/external/junit.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/fuzzer.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libjpeg_turbo.git.insteadOf https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libsrtp.git.insteadOf https://chromium.googlesource.com/chromium/deps/libsrtp.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libvpx.git.insteadOf https://chromium.googlesource.com/webm/libvpx.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/libyuv.git.insteadOf https://chromium.googlesource.com/libyuv/libyuv.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/linux-syscall-support.git.insteadOf https://chromium.googlesource.com/linux-syscall-support.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/mockito.git.insteadOf https://chromium.googlesource.com/external/mockito/mockito.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/nasm.git.insteadOf https://chromium.googlesource.com/chromium/deps/nasm.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/openh264.git.insteadOf https://chromium.googlesource.com/external/github.com/cisco/openh264
    git config --global url.http://120.92.49.206:3232/chromiumsrc/requests.git.insteadOf https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/robolectric.git.insteadOf https://chromium.googlesource.com/external/robolectric.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/ub-uiautomator.git.insteadOf https://chromium.googlesource.com/chromium/third_party/ub-uiautomator.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/usrsctp.git.insteadOf https://chromium.googlesource.com/external/github.com/sctplab/usrsctp
    git config --global url.http://120.92.49.206:3232/chromiumsrc/binaries.git.insteadOf https://chromium.googlesource.com/chromium/deps/yasm/binaries.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/patched-yasm.git.insteadOf https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/tools.git.insteadOf https://chromium.googlesource.com/chromium/src/tools
    git config --global url.http://120.92.49.206:3232/chromiumsrc/client-py.git.insteadOf https://chromium.googlesource.com/infra/luci/client-py.git
    git config --global url.http://120.92.49.206:3232/chromiumsrc/boringssl.git.insteadOf https://boringssl.googlesource.com/boringssl.git
    

depot_tools安装

  1. 原文命令是在Linux环境下,有些命令Windows不可用,比如exportchmodrm等。所以我只用了以下的命令。新建一个工作目录webrtc。

    cd webrtc
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    
    cd depot_tools
    git checkout gitlab
    
  2. 手动设置环境变量,将depot_tools目录添加到Path,并移动到最上面。

同步WebRTC

  1. 在depot_tools文件夹同级目录创建code文件夹,并执行以下命令。

    cd code
    
    gclient config --name src https://chromium.googlesource.com/external/webrtc.git@gitlab
    
    set CDS_CLANG_BUCKET_OVERRIDE=http://120.92.49.206:3232/chromiumsrc/commondatastorage/raw/master/public/chromium-browser-clang
    
    <!--告诉depot_tools使用我们本机的VS进行编译--
    set DEPOT_TOOLS_WIN_TOOLCHAIN=0 
    
    gclient sync --patch-ref=https://chromium.googlesource.com/chromium/src/build.git@gitlab
    

    这一步会花费很长的时间,期间可能会报错,比如‘tar’不是内部或外部命令,也不是可运行的程序,找到工具所在目录,并添加到环境变量path里面,重启一下电脑。然后再执行一次gclient sync命令。

编译

  1. 进入webrtc/src文件夹

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

    此时,我们在out文件夹,就能看到久违的all.sln文件了。欣赏一下吧。

    GN命令参数如下(原文地址

    GN optionally generates files for IDE. Possibilities for <ide options>
    
      --ide=<ide_name>
          Generate files for an IDE. Currently supported values:
          "eclipse" - Eclipse CDT settings file.
          "vs" - Visual Studio project/solution files.
                 (default Visual Studio version: 2017)
          "vs2013" - Visual Studio 2013 project/solution files.
          "vs2015" - Visual Studio 2015 project/solution files.
          "vs2017" - Visual Studio 2017 project/solution files.
          "vs2019" - Visual Studio 2019 project/solution files.
          "xcode" - Xcode workspace/solution files.
          "qtcreator" - QtCreator project files.
          "json" - JSON file containing target information
    
      --filters=<path_prefixes>
          Semicolon-separated list of label patterns used to limit the set of
          generated projects (see "gn help label_pattern"). Only matching targets
          and their dependencies will be included in the solution. Only used for
          Visual Studio, Xcode and JSON.
    
      --sln=<file_name>
          Override default sln file name ("all"). Solution file is written to the
          root build directory.
    
      --no-deps
          Don't include targets dependencies to the solution. Changes the way how
          --filters option works. Only directly matching targets are included.
    
      --winsdk=<sdk_version>
          Use the specified Windows 10 SDK version to generate project files.
          As an example, "10.0.15063.0" can be specified to use Creators Update SDK
          instead of the default one.
    
      --ninja-extra-args=<string>
          This string is passed without any quoting to the ninja invocation
          command-line. Can be used to configure ninja flags, like "-j".
    

    比如:

    gn gen --ide=vs2017 --winsdk=10.0.17763.132 --args="is_debug=true is_clang=true proprietary_codecs=true ffmpeg_branding=\"Chrome\" target_cpu=\"x64\"" out/Debug
    
    1. 开启Debug模式,如果编译Release置为false即可。
    --args="is_debug=true"
    
    1. 如果使用VS编译,则需要关闭clang编译。我们使用默认编译器,需要置为true
    --args="is_clang=false" 
    
    1. webrtc最新版默认使用64位编译,好像不支持32位,所以下面选型可以不写
    --args="target_cpu=\"x64\"" 
    

    如果需要清理工程

    gn clean out/Debug
    

    注意:设置了参数is_clang=false之后,/third_party/libyuv/libyuv_internal.lib这个文件会编译失败,需要通过VS手动编译一下

  2. 使用ninja 编译

    ninja -C out/Default
    

使用VS编译peerconnection_client

参考文章让自己的vs工程能够使用webrtc库.

Android 编译并支持H264 (网友提供,本人未测试)

编译webrtc h264步骤:
	1.gn gen out/Debug --args='target_os="android" target_cpu="arm" rtc_use_h264=true ffmpeg_branding="Chrome" proprietary_codecs=true'

	2.src/sdk/android/api/org/webrtc/ 创建FFmpegH264Encoder.java FFmpegH264Decoder.java,并加入SoftwareEncoderFactory和DecoderFactory

	3.src/sdk/android/src/jni/ 创建h264_codec.cc

	4.src/sdk/android/BUILD.gn ,添加generated_ffmpeg_h264_jni,添加ffmpeg_h264_jni,添加ffmpeg_h264_java,libwebrtc中添加ffmpeg_h264_java,swcodecs_java中添加ffmpeg_h264_java

	5.修改src/thrid_party/ffmpeg/ffmpeg_generated.gni 

	6.修改src/thrid_party/ffmpeg/chromium/config/Chrome/android/arm-neon/config.h libavcodec/codec_list.c  parser_list.c

常见错误及解决办法

  1. 同步代码时,Exception: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VC\vcvarsall.bat is missing - make sure VC++ tools are installed

    解决方法:环境变量配置错误,将文件所在目录添加到环境变量(存疑

  2. 同步代码时,遇到各种“不是内部或外部命令,也不是可运行的程序”

    解决方法:找到工具所在目录,并添加到环境变量path里面,重启一下电脑

  3. 使用VS编译时,unknown type name ‘KSJACK DESCRIPTION’; did you mean ‘SERVICE_DESCRIPTION’

    解决方法:安装10.0.17134 或以上的Win10 SDK(参考2.2),并重新执行gn gen --ide=vs out/Default命令。

  4. 编译demo时报错:fatal error LNK1107: 文件无效或损坏: 无法在 0x38B4 处读取

    解决方法:webrtc默认的编译器是clang. 通过她编译出来的lib有时候我们的vs工程用不了,需要在使用gn生成工程文件的时候需要带上 “is_clang=false ” 这样的参数。这样编译之后会少一些lib,需要通过VS手动编译一下

  5. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”
    解决方法:是运行库设置的问题; 几个工程的 运行库设置不一样了:项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行库,都设置一样就行了 多线程调试(/MTd)

致谢

再次感谢声网提供的资源

其他参考链接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章