寫在前面的話
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命令窗口輸入,注意使用管理員權限。
環境配置
-
配置gitlab賬號。注意,是gitlab賬號,不是github賬號。
git config --global user.email "[email protected]" git config --global user.name "username"
-
設置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路徑。 -
替換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安裝
-
原文命令是在Linux環境下,有些命令Windows不可用,比如
export
、chmod
、rm
等。所以我只用了以下的命令。新建一個工作目錄webrtc。cd webrtc git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git cd depot_tools git checkout gitlab
-
手動設置環境變量,將depot_tools目錄添加到Path,並移動到最上面。
同步WebRTC
-
在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
命令。
編譯
-
進入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
- 開啓Debug模式,如果編譯Release置爲false即可。
--args="is_debug=true"
- 如果使用VS編譯,則需要關閉clang編譯。我們使用默認編譯器,需要置爲true
--args="is_clang=false"
- webrtc最新版默認使用64位編譯,好像不支持32位,所以下面選型可以不寫
--args="target_cpu=\"x64\""
如果需要清理工程
gn clean out/Debug
注意:設置了參數
is_clang=false
之後,/third_party/libyuv/libyuv_internal.lib
這個文件會編譯失敗,需要通過VS手動編譯一下 -
使用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
常見錯誤及解決辦法
-
同步代碼時,Exception: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VC\vcvarsall.bat is missing - make sure VC++ tools are installed
解決方法:環境變量配置錯誤,將文件所在目錄添加到環境變量(存疑)
-
同步代碼時,遇到各種“不是內部或外部命令,也不是可運行的程序”
解決方法:找到工具所在目錄,並添加到環境變量path裏面,重啓一下電腦
-
使用VS編譯時,unknown type name ‘KSJACK DESCRIPTION’; did you mean ‘SERVICE_DESCRIPTION’
解決方法:安裝10.0.17134 或以上的Win10 SDK(參考2.2),並重新執行
gn gen --ide=vs out/Default
命令。 -
編譯demo時報錯:fatal error LNK1107: 文件無效或損壞: 無法在 0x38B4 處讀取
解決方法:webrtc默認的編譯器是clang. 通過她編譯出來的lib有時候我們的vs工程用不了,需要在使用gn生成工程文件的時候需要帶上 “is_clang=false ” 這樣的參數。這樣編譯之後會少一些lib,需要通過VS手動編譯一下。
-
error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”
解決方法:是運行庫設置的問題; 幾個工程的 運行庫設置不一樣了:項目屬性 -> 配置屬性 -> C/C++ -> 代碼生成 -> 運行庫,都設置一樣就行了 多線程調試(/MTd)
致謝
再次感謝聲網提供的資源
其他參考鏈接:
- https://blog.jianchihu.net/webrtc-build-vs2017.html,
- https://mp.weixin.qq.com/s/Ha3vn4c0MSk9v14Jo0ku0w
- https://blog.csdn.net/foruok/article/details/69525039