1、概述
我的代碼是比較新的,基于webrtc源碼倉庫的main分支的,在windows下把源碼倉庫下載好了后,用visual stdio 2022打開進行編譯調試src/examples/peerconnection_client測試項目,主要是跑通這個demo來入手和調試,純看代碼很難理解,只有編看代碼編調試,然后遇到不懂的網上搜索,逐個技術點擊破,希望通過這樣的學習來了解WebRTC
圖1-1 webrtc倉庫源碼分支信息
2、peerconnection_client例子
2.1 簡介
peerconnection_client是原生端的測試例子,但是麻雀雖小,五臟俱全,從信令服務器通信到雙向的音視頻通話,什么都有,從這個例子進行學習分析webrtc源碼是最好的選擇,我們主要從client入手
圖2.1-1 peerconnection_client代碼圖
2.2 如何運行demo
直接運行會報錯,通信不了,需要對demo做一些修改
2.2.1 添加socket類
class CustomSocketServer : public rtc::PhysicalSocketServer {public:bool Wait(webrtc::TimeDelta max_wait_duration, bool process_io) override {if (!process_io)return true;return rtc::PhysicalSocketServer::Wait(webrtc::TimeDelta::Zero(),+process_io);}};
備注:在main.cc函數前面添加即可
圖2.2.1-1 添加CustomSocketServer類的位置圖
2.2.2 修改wWinMain函數
把webrtc::PhysicalSocketServer ss;注釋掉,替換為上面2.2.1新的類CustomSocketServer
圖2.2.2-1 替換socket通信代碼位置圖
2.2.3 添加main_thread.Start()
在? // Main loop 注釋前面添加
2.2.3-1 線程啟動代碼位置圖
2.2.4 修改webrtc服務器的地址(媒體服務器)
采用的是coturn作為webrtc的服務器,具體的coturn是怎么搭建的,可以看我的博客WebRTC服務器Coturn服務器部署和相關系列文檔
圖2.2.4-1 配置webrtc服務器圖
采用的是coturn服務器,STUN和TURN服務器都是在同一臺,所以配置格式如下
stun:ip:port
turn:ip:port?transport:udp
2.2.5?編譯運行結果
運行起來就得到下圖這個結果了,這個127.0.0.1是我自己改的,默認是localhost,我本機調試發現localhost連接不上,所以我改為了127.0.0.1
圖2.2.5-1 修改localhost為127.0.0.1圖
windows下編譯運行peerconnection_client如下結果
圖2.2.5-2 編譯運行demo圖
2.2.6?運行peerconnection_server.exe
peerconnection_server.exe是webrtc源碼提供的信令服務器,我們offer,answer,candidate這些信令的交互就是通過這個peerconnectoin_server來透傳的了
我們在本地再運行一個peerconnecton_client.exe來進行通信,下圖中間是peerconnection_server.exe運行起來的樣子
圖2.2.6-1 兩兩通話和信令服務器運行圖
兩兩通話的結果如下
圖2.2.6-2 通過實際視頻數據傳輸渲染結果圖
備注:我本地是windows臺式機的,沒有攝像,所以我下載了個vcam虛擬攝像頭來測試
3、peerconnection_client的代碼簡單介紹
圖3-1 client代碼組成圖
圖3-2 各個類之間的關系UML
conductor類: 整個demo邏輯的大腦核心,負責創建peerconnection,注冊回調函數到peerconnection,從回調函數得到offer、answer、candidate等信息后續的處理,還協調窗口的顯示和信令的發送處理,從UML類圖也可以發現,MainWnd和PeerConnectionClient是它的成員,協調這個兩個類進行邏輯處理
main_wnd類:主要是界面的顯示和界面的切換邏輯的處理,主要的技術點有windows窗口和消息機制,視頻數據的渲染,采用BitBlt原生windows API進行圖像數據的渲染
peer_connection_client類:主要就是與信令服務器進行交互,發送信令offer、answer、candidate等信令消息,并處理接收信令消息,然后通過callback回調數據給Conductor類進行具體的邏輯處理。
4、結論說明
這個demo是比較重要的,作為分析源碼的開始,這是個很好的入門例子,很多技術點都是可以從這個demo開始,然后邊調試邊分析總結,WebRTC的源碼很龐大,涉及到的知識點很多,需要一步步慢慢地進行學習分析。