天天看點

VS中引入并使用WebRTC庫

1、安裝開發環境

在Windows下開發應用程式最常用的開發工具還是Visual Studio,你可以使用VS2019,也可以使用VS2022,目前我還是建議大家先用 VS2019,再等個半年、一年的換VS2022比較合适。VS2019的下載下傳位址在這裡,将 VS Installer下載下傳好後,在CMD視窗中執行下面的指令即可。

$ PATH_TO_INSTALLER.EXE ^

--add Microsoft.VisualStudio.Workload.NativeDesktop ^

--add Microsoft.VisualStudio.Component.VC.ATLMFC ^

--includeRecommended

當然,正常情況下你在配置WebRTC編譯環境時就應該已經将VS安裝好了。

2、編譯WebRTC

開發環境安裝好後,下面我們就該編譯WebRTC源碼了。WebRTC源碼的下載下傳與編譯請看這篇文章。

需要注意的是,我們在新項目中引入的WebRTC庫,不能直接用下面的指令進行編譯:

gn gen out/Default

ninja -C out/Default

而必須明确指明編譯出的WebRTC是Debug版本,還是Release版本;是x86版本還是x64版本……

是以,應該使用下面的指令編譯WebRTC:

gn gen --target=x64 --ide=vs2019 --args="is_debug=true rtc_enable_protobuf=false is_cx64\" enable_iterator_debugging=true use_custom_libcxx=false symbol_level=0 rtc_include_tests=false" out/debug_x64

ninja - C out/debug_x64

上述 gn 中的幾個參數含義如下:

  • –target,顧名思義,生成x64版本的WebRTC庫
  • –ide,生成VS工程檔案
  • –args,編譯時的一些配置參數
  • is_debug,為true編譯出Debug版本;為false編譯出Release版本
  • rtc_enable_protobuf,是否使用protobuf,使用可将其設定為true
  • use_custom_libcxx,WebRTC預設使用的是libc++庫,而我們在Windows上使用的是libstdc++庫,是以需要将其設定為false
  • symbol_level,編譯出的WebRTC庫是否帶符号表,這個資料量很大,會影響運作速度,是以一般設定為0,表示編譯出的WebRTC不帶符号表
  • rtc_include_tests,編譯WebRTC時是否編譯測試用例,如果為false則不編譯,這樣可以大大加快WebRTC的編譯速度

執行上面的指令時,會花一些時間,是以我們需要讓子彈飛一會兒……

3、建構自己的應用程式

如果順利的話,你現在應該已經将WebRTC庫編譯好了。接下來我們來建立自己的應用程式。

為了友善,你可以将WebRTC examples中的peerconnection_client代碼拿出來建構一個新的工程,之後再将前面編譯好的WebRTC庫引入進來,如果它可以正常運作就達到了我們的目标。

為了達到這個目标,首先我們先使用VS建立一個空項目,步驟如下:

  • 第一步,打開Visual Studio,建立新項目
VS中引入并使用WebRTC庫
  • 第二步,使用Windows桌面向導建立Windows空項目
VS中引入并使用WebRTC庫
  • 第三步,填寫項目名稱,并将項目與解決方案放在同一目錄下
VS中引入并使用WebRTC庫
  • 第四步,選擇應用程式類型為桌面應用程式
VS中引入并使用WebRTC庫
  • 第五步,同時勾選空項目
VS中引入并使用WebRTC庫

至此,我們就建構出了一個VS空項目,它裡邊沒有任何檔案,如下圖所示:

VS中引入并使用WebRTC庫

空項目建立好後,緊接着我們來移植peerconnection_client代碼到新項目中,步驟如下:

  • 第一步,從WebRTC源碼中拷貝peerconnection_client中的代碼到新項目的目錄中,在我這裡是将C:\webrtc\webrtc-checkout\src\exmaples\peerconnection\client目錄中的代碼拷貝到C:\Users\lichao\sourceMyWebRTCDemo目錄下。如下圖所示:
VS中引入并使用WebRTC庫
VS中引入并使用WebRTC庫
  • 第二步,将新項目中的代碼拖到VS項目中
VS中引入并使用WebRTC庫

通過以上步驟我們就将peerconnection_client中的代碼移植好了。接下來咱們來看重頭戲,如何在項目中引入WebRTC庫。

4、引入WebRTC庫

通常我們引入一個外部庫隻需要兩步,引入庫檔案和其頭檔案。不過,對于WebRTC,更準确的說對于peerconnection_client而言,它需要的不僅僅是WebRTC庫,還需要将WebRTC依賴的第三方庫加進來,這是大家覺得在Windows下使用WebRTC庫比較麻煩的原因。

下面咱們就來看一下如何引入WebRTC庫吧!

4.1添加依賴的頭檔案

我們若想将WebRTC頭檔案引入到項目中,可以通過下面兩種方法引入:

  • 方法一,在VS中将WebRTC源碼路徑添加到附加包含目錄中。比如我這裡将WebRTC源碼下載下傳到了C:\webrtc\webrtc-checkout\src目錄下,我隻需将該路徑添加到:

項目 -> 屬性 -> C/C++ -> 正常 -> 附加包含目錄

中即可,如下圖所示:

VS中引入并使用WebRTC庫

這種方法的好處是簡單友善,壞處是不便于我們将庫檔案釋出給别人使用。

  • 方法二,我們可以通過這個腳本将WebRTC中的頭檔案提取出來。之後與方法一一樣,将頭檔案路徑添加到附加包含目錄中即可。

需要注意的是,這個腳本下載下傳後,要将其放到WebRTC源碼目錄src的同級目錄中,如下圖所示:

VS中引入并使用WebRTC庫

之後打開Windows控制台,并進入到src的同級目錄中,在CMD視窗中執行extract_webrtc_headers.bat腳本,這樣就可以将WebRTC頭檔案提取出來了,如下圖所示:

VS中引入并使用WebRTC庫

這種方法的優點是友善其他人使用,缺點是抽取頭檔案需要花一些時間。

除了添加上面的頭檔案路徑外,我們還需要将下面幾個路徑添加到附加包含項目中:

C:\webrtc\webrtc-checkout\src\third_party\jsoncpp\generated

C:\webrtc\webrtc-checkout\src\third_party\jsoncpp\source\include

C:\webrtc\webrtc-checkout\src\third_party\libyuv\include

C:\webrtc\webrtc-checkout\src\third_party\abseil-cpp

4.2.添加依賴的庫

頭檔案添加好後,接下來咱們來添加WebRTC庫檔案。WebRTC編譯好後,你可以在WebRTC源碼目錄src的out/debug_x64/obj目錄下找到WebRTC.lib檔案,這就是編譯好的WebRTC庫。

我們将它添加到VS中的附加庫目錄中,具體操作如下:

右鍵項目 -> 屬性 -> 連結器 -> 正常 -> 附加庫目錄

WebRTC庫檔案路徑添加好後,如下圖所示:

VS中引入并使用WebRTC庫

接着咱們添加具體的的依賴庫,添加依賴庫的位置在:

右鍵項目 -> 屬性 -> 連結器 -> 輸入 -> 附加依賴項

如下圖所示:

VS中引入并使用WebRTC庫

具體都依賴哪些依賴項呢?這裡我以 M93(4577) 為例,對于這個版本的peerconnection_client來說,它需要下面的依賴庫:

  • WebRTC相關的庫包括:

third_party/abseil-cpp/absl/flags/marshalling/marshalling.obj

third_party/abseil-cpp/absl/flags/program_name/program_name.obj

third_party/abseil-cpp/absl/flags/flag/flag.obj

third_party/abseil-cpp/absl/flags/flag_internal/flag.obj

third_party/abseil-cpp/absl/flags/commandlineflag/commandlineflag.obj

third_party/abseil-cpp/absl/flags/commandlineflag_internal/commandlineflag.obj

third_party/abseil-cpp/absl/flags/private_handle_accessor/private_handle_accessor.obj

third_party/abseil-cpp/absl/flags/reflection/reflection.obj

third_party/abseil-cpp/absl/flags/parse/parse.obj

third_party/abseil-cpp/absl/flags/usage/usage.obj

third_party/abseil-cpp/absl/flags/usage_internal/usage.obj

third_party/abseil-cpp/absl/flags/config/usage_config.obj

third_party/jsoncpp/jsoncpp/json_reader.obj

third_party/jsoncpp/jsoncpp/json_value.obj

third_party/jsoncpp/jsoncpp/json_writer.obj

test/field_trial/field_trial.obj

test/video_test_common/test_video_capturer.obj

test/platform_video_capturer/vcm_capturer.obj

rtc_base/rtc_json/json.obj

  • 系統相關的庫包括:

advapi32.lib

comdlg32.lib

dbghelp.lib

dnsapi.lib

gdi32.lib

msimg32.lib

odbc32.lib

odbccp32.lib

oleaut32.lib

shell32.lib

shlwapi.lib

user32.lib

usp10.lib

uuid.lib

version.lib

wininet.lib

winmm.lib

winspool.lib

ws2_32.lib

delayimp.lib

kernel32.lib

ole32.lib

crypt32.lib

iphlpapi.lib

secur32.lib

dmoguids.lib

wmcodecdspuuid.lib

amstrmid.lib

msdmo.lib

strmiids.lib

4.3添加宏

除了上面講的需要引入頭檔案和WebRTC庫之外,還需要添加下面這些宏。這些宏的具體含義我有不介紹了,有興趣的同學可以自己在網上搜尋一下。

USE_AURA=1

_HAS_NODISCARD

_HAS_EXCEPTIONS=0

__STD_C

_CRT_RAND_S

_CRT_SECURE_NO_DEPRECATE

_SCL_SECURE_NO_DEPRECATE

_ATL_NO_OPENGL

_WINDOWS

CERT_CHAIN_PARA_HAS_EXTRA_FIELDS

PSAPI_VERSION=2

WIN32

_SECURE_ATL

WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP

WIN32_LEAN_AND_MEAN

NOMINMAX

_UNICODE

UNICODE

NTDDI_VERSION=NTDDI_WIN10_VB

_WIN32_WINNT=0x0A00

WINVER=0x0A00

_DEBUG

DYNAMIC_ANNOTATIONS_ENABLED=1

WEBRTC_ENABLE_PROTOBUF=0

WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE

RTC_ENABLE_VP9

WEBRTC_HAVE_SCTP

WEBRTC_ENABLE_AVX2

RTC_ENABLE_WIN_WGC

WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0

WEBRTC_WIN

ABSL_ALLOCATOR_NOTHROW=1

_ENABLE_EXTENDED_ALIGNED_STORAGE

ABSL_FLAGS_STRIP_NAMES=0

HAVE_WEBRTC_VIDEO

添加方法如下:

  • 首先在 VS 中執行下面的操作,

右鍵項目 -> 屬性 -> C/C++ -> 預處理器

  • 之後将上面的宏添加到預處理器中即可。

4.4編譯運作

到此為止,我們就将peerconnection_client的代碼移植好了,直接點

VS中引入并使用WebRTC庫

測試一下吧!此時,編譯器有可能報4996的錯誤,解決該問題辦法很簡單,隻要在

右鍵項目項 -> 屬性 -> C/C++ -> 進階 -> 禁用特定警告

中将 4996 添加進去即可。除此之外,還有可能遇到 /MDd 錯誤,解決它可以通過在

右鍵項目項 -> 屬性 -> C/C++ -> 代碼生成 -> 運作庫

中将 /MDd 改為 /MTd 即可。

如果一切順利,peerconnection_client的連接配接視窗就展示在你面前了,如下圖所示。

VS中引入并使用WebRTC庫

此時,你需要先将peerconnection_server程式運作起來,讓它偵聽 8888 端口;之後在peerconnection_client的連接配接界面中輸入 127.0.0.1,點選連接配接,如果能進入清單界面就表明OK了。

5、小結

上面我詳細的向你介紹了如何将WebRTC中的peerconnection_client代碼移植出來,并重點向你講解了如何在項目中引入WebRTC庫。

其重點包括三步:一是添加WebRTC庫頭檔案路徑;二是添加WebRTC庫路徑,及其WebRTC庫;三是添加一堆宏。隻要将上面三個步驟操作好了,其它的一些問題在網上都能找到答案。

原文https://zhuanlan.zhihu.com/p/604361972

★文末名片可以免費領取音視訊開發學習資料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音視訊學習路線圖等等。

見下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

繼續閱讀