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,建立新項目
- 第二步,使用Windows桌面向導建立Windows空項目
- 第三步,填寫項目名稱,并将項目與解決方案放在同一目錄下
- 第四步,選擇應用程式類型為桌面應用程式
- 第五步,同時勾選空項目
至此,我們就建構出了一個VS空項目,它裡邊沒有任何檔案,如下圖所示:
空項目建立好後,緊接着我們來移植peerconnection_client代碼到新項目中,步驟如下:
- 第一步,從WebRTC源碼中拷貝peerconnection_client中的代碼到新項目的目錄中,在我這裡是将C:\webrtc\webrtc-checkout\src\exmaples\peerconnection\client目錄中的代碼拷貝到C:\Users\lichao\sourceMyWebRTCDemo目錄下。如下圖所示:
- 第二步,将新項目中的代碼拖到VS項目中
通過以上步驟我們就将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++ -> 正常 -> 附加包含目錄
中即可,如下圖所示:
這種方法的好處是簡單友善,壞處是不便于我們将庫檔案釋出給别人使用。
- 方法二,我們可以通過這個腳本将WebRTC中的頭檔案提取出來。之後與方法一一樣,将頭檔案路徑添加到附加包含目錄中即可。
需要注意的是,這個腳本下載下傳後,要将其放到WebRTC源碼目錄src的同級目錄中,如下圖所示:
之後打開Windows控制台,并進入到src的同級目錄中,在CMD視窗中執行extract_webrtc_headers.bat腳本,這樣就可以将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庫檔案路徑添加好後,如下圖所示:
接着咱們添加具體的的依賴庫,添加依賴庫的位置在:
右鍵項目 -> 屬性 -> 連結器 -> 輸入 -> 附加依賴項
如下圖所示:
具體都依賴哪些依賴項呢?這裡我以 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的代碼移植好了,直接點
測試一下吧!此時,編譯器有可能報4996的錯誤,解決該問題辦法很簡單,隻要在
右鍵項目項 -> 屬性 -> C/C++ -> 進階 -> 禁用特定警告
中将 4996 添加進去即可。除此之外,還有可能遇到 /MDd 錯誤,解決它可以通過在
右鍵項目項 -> 屬性 -> C/C++ -> 代碼生成 -> 運作庫
中将 /MDd 改為 /MTd 即可。
如果一切順利,peerconnection_client的連接配接視窗就展示在你面前了,如下圖所示。
此時,你需要先将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)以及音視訊學習路線圖等等。
見下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓