架構(gòu)
整理分為兩層:
應(yīng)用層任洞、核心層綠色部分是核心部分蓄喇,
是WebRTC提供的核心功能;紫色部分是瀏覽器提供的JS的API層交掏;
即
瀏覽器對(duì)WebRTC核心層的C++ API 做了一層封裝妆偏,
封裝成了JS接口;最上面的箭頭是
上層應(yīng)用
了盅弛,
上層應(yīng)用
可以在 瀏覽器中 直接訪問 瀏覽器提供的API钱骂;最終調(diào)用到核心層【藍(lán)色虛線框、可重載E才簟见秽!】
WebRTC核心層
C++ API:API數(shù)量較少,主要是PeerConnection讨盒;
(PeerConnection的API又包含傳輸質(zhì)量解取、傳輸質(zhì)量報(bào)告、各種統(tǒng)計(jì)數(shù)據(jù)催植、各種流等)
【設(shè)計(jì)技巧:
對(duì)于上層來說肮蛹,提供的API簡(jiǎn)單勺择,方便應(yīng)用層開發(fā);
內(nèi)部比較復(fù)雜伦忠;】Session層【上下文管理層】:
如應(yīng)用創(chuàng)建了音頻省核、視頻、非音視頻的數(shù)據(jù)傳輸昆码,
都可以在Session層做處理气忠,做管理相關(guān)的邏輯;-
【最重要】引擎層/傳輸層【核心】
音頻赋咽、視頻旧噪、傳輸 解耦
音頻引擎:【Voice Engine】
ISAC/ILBC 編解碼;
NetEQ 【Buffer】 網(wǎng)絡(luò)適配脓匿、防止網(wǎng)絡(luò)抖動(dòng)淘钟;
回音消除(echo canceler):
音視頻重點(diǎn),決定產(chǎn)品質(zhì)量陪毡,
WebRTC里提供了相關(guān)非常成熟的算法
米母,開發(fā)時(shí)只需要調(diào)節(jié)參數(shù)
即可;
降噪(Noise Reduction)毡琉、自動(dòng)增益铁瞒;視頻引擎:【Video Engine】
VP8、openH264 編解碼桅滋;
Video jitter buffer:防止視頻抖動(dòng)慧耍;
Image enhancements:圖像增強(qiáng);傳輸【Transport】
底層用的UDP丐谋,上層用的SRTP【即安全的芍碧、加密后的RTP】;
Multiplexing:多個(gè)流復(fù)用同一個(gè)通道笋鄙;
P2P層【包括 STUN+TURN+ICE】师枣;
所有的
音頻視頻的接收與發(fā)送怪瓶,
都是通過傳輸層去做的萧落,
傳輸層包括了泄漏的檢測(cè)、網(wǎng)絡(luò)鏈路質(zhì)量檢測(cè)洗贰,
根據(jù)情況估算網(wǎng)絡(luò)帶寬找岖,根據(jù)網(wǎng)絡(luò)帶寬進(jìn)行音視頻、文件等非音視頻
的傳輸敛滋;
- 硬件層
視頻采集许布、渲染;
音頻采集绎晃;
網(wǎng)絡(luò)IO等蜜唾;
WebRTC的核心層中是沒有視頻的渲染的杂曲,
所有的渲染都需要 應(yīng)用層 或者 瀏覽器層 自己做;
WebRTC目錄結(jié)構(gòu)
- WebRTC代碼量大袁余,目錄多
-
實(shí)際開發(fā)中擎勘,可能需要我們修改WebRTC的代碼,
所以颖榜,我們必須知道每個(gè)目錄的功能棚饵、作用是什么;
補(bǔ)充說明
call掩完,一個(gè)端一個(gè)call噪漾,多個(gè)端多個(gè)call;
-
module目錄很大且蓬,也特別重要欣硼,
里邊有很多子模塊,
每個(gè)子模塊也都非常重要恶阴;
pc:【重要目錄分别,上層的一個(gè)統(tǒng)一接口層】
Peer Connection,代表一個(gè)連接存淫,
連接下邊就要有很多相關(guān)API了耘斩,
如,
Stream 流桅咆;
chain 軌【音頻軌括授、視頻軌、桌面軌】
【軌 即 一系列永不相交的平行線(線程)岩饼,
即音頻與視頻與桌面處理荚虚,都是各自處理,互不交叉的】籍茧;
所以在Peer Connection
中我們可以拿到流
版述,
通過流
我們可以拿到每一個(gè)多媒體
,
還可以拿到所有媒體的統(tǒng)一信息
寞冯、傳輸?shù)?code>統(tǒng)一信息等p2p:
端對(duì)端的傳輸時(shí)渴析,需要先檢查p2p是否能打通;
相應(yīng)的協(xié)議吮龄、工具俭茧、API等,放在這里漓帚;rtc_base
:
不同操作系統(tǒng)母债,如Window和Linux,之間的系統(tǒng)函數(shù)差別就特別大;
但是rtc_base
都封裝好了毡们,
上層按照規(guī)范編寫調(diào)用邏輯即可迅皇,
框架會(huì)判斷是在哪個(gè)平臺(tái)運(yùn)行,并執(zhí)行相應(yīng)的代碼衙熔;rtc_tool
是音視頻相關(guān)的測(cè)試喧半;
tool_webrtc
是整個(gè)框架的測(cè)試;system_wrappers
青责,
存放操作系統(tǒng)等操作代碼挺据,
不同系統(tǒng)不同文件存放;
以上是WebRTC最外層的目錄脖隶,
下面看WebRTC目錄下的Modules子目錄
WebRTC Modules 目錄
audio_coding:
上面的WebRTC架構(gòu)圖中
提到的 ISAC/ILBC扁耐、VP8等編解碼器邏輯捞烟,
都是放在這個(gè)目錄下的摸袁;audio_device:
現(xiàn)在的WebRTC文件中關(guān)于Android、IOS的部分都放在sdk目錄下了贤牛,
而之前的話构蹬,
所有的設(shè)備類型包括Android王暗、IOS、Window庄敛、Mac俗壹、Linux
的邏輯都是在audio_device
目錄下的;
現(xiàn)在的話Android藻烤、IOS
被提取出去绷雏,
這里放的是關(guān)于Window、Mac怖亭、Linux
的文件涎显;audio_mixer:
混音的概念:
比如現(xiàn)在有幾個(gè)用戶同時(shí)在說話,
這樣子會(huì)產(chǎn)生多個(gè)音頻流
兴猩,
WebRTC則會(huì)把這幾個(gè)音頻流
混合在一起期吓,
這樣子在傳輸?shù)臅r(shí)候就比較方便,
減少了音頻流
總數(shù)倾芝;
那這個(gè)混音相關(guān)的邏輯文件讨勤,就放在audio_mixer
這里;audio_processing:
音頻前后處理:指回音消除蛀醉、降噪悬襟、增益
等處理操作;bitrate_controller:碼率拯刁、碼流控制;
-
congestion_controller
:
當(dāng)我們檢測(cè)到網(wǎng)絡(luò)流量
比較高的時(shí)候逝段,
我們要做一些流量控制
垛玻,
防止網(wǎng)絡(luò)包把帶寬打死割捅;
相關(guān)處理邏輯 則 放在本文件夾下;
探測(cè)碼率之后帚桩,對(duì)碼率做一個(gè)均衡的平滑的處理亿驾,再發(fā)送交互;
video_processing:
視頻前后處理:指回音消除账嚎、降噪莫瞬、增益
等處理操作;
如增加人臉識(shí)別
功能也可以放在這個(gè)目錄下郭蕉;
WebRTC的運(yùn)行機(jī)制
軌
- Track
- 視頻與音頻是不相交的疼邀,單獨(dú)存放;
- 兩路音頻也是兩路軌召锈,不相交旁振;
流
- MediaStream
- 借鑒了傳統(tǒng)媒體流的概念;
傳統(tǒng)媒體流中也包括了音頻軌涨岁、視屏軌等拐袜;
WebRTC重要的類
MediaStream
傳輸媒體數(shù)據(jù);RTCPeerConnection【核心】
這個(gè)WebRTC中最為重要的類梢薪,
是一個(gè)大而全的類蹬铺,包含了很多重要的功能;
設(shè)計(jì)優(yōu)勢(shì):
在應(yīng)用層應(yīng)用時(shí)方便秉撇,
只需要?jiǎng)?chuàng)建一個(gè)RTCPeerConnection
連接丛塌,
然后把一個(gè)MediaStream
媒體流搭載上去,
隨后的細(xì)節(jié)就不用管了畜疾,
其中所有的傳輸赴邻、尋路等細(xì)節(jié),
都由RTCPeerConnection
內(nèi)部封裝實(shí)現(xiàn)了啡捶,底層封裝做了很多相關(guān)的工作姥敛;RTCDataChannel
非音視頻的數(shù)據(jù)(如文本文件、二進(jìn)制數(shù)據(jù)
等)瞎暑,都通過RTCDataChannel
來傳輸彤敛;
RTCDataChannel
是通過RTCPeerConnection
獲取的;
傳輸非音視頻的數(shù)據(jù)時(shí)了赌,
應(yīng)用層要做的墨榄,
就是拿到一個(gè)RTCDataChannel
對(duì)象,把數(shù)據(jù)
搭載上去即可勿她;
PeerConnection調(diào)用過程
Worker 線程袄秩、Signaling線程,
創(chuàng)建PeerConnectionFactory
,
PeerConnectionFactory
可以
創(chuàng)建PeerConnection
之剧、LocalMediaStream
郭卫、LocalVide/AudioTrack
等;多方進(jìn)行通訊時(shí)背稼,
每一方(每一個(gè)參與單位)都是對(duì)應(yīng)一個(gè)Stream贰军;
調(diào)用時(shí)序圖
首先應(yīng)用層
Application
【注意這里Application
本身就是一個(gè)PeerConnectionObserver
】,
創(chuàng)建出一個(gè)PeerConnectionFactory
【CreatePeerConnectionFactory
】蟹肘;PeerConnectionFactory
觸發(fā)CreatePeerConnection
词疼、
CreateLocalMediaStream
、CreateLocalVideoTrack
帘腹、CreateLocalAudioTrack
創(chuàng)建了PeerConnection
贰盗、MediaStream
等等實(shí)例;然后通過
AddTrack
竹椒,
把各種軌(track)加到流(LocalMediaStream
)中去童太,
然后通過AddStream
,
把流加到PeerConnection
中胸完;流加到連接之后书释,
會(huì)通過CommitStreamChanges
提交流的變化;
當(dāng)流發(fā)生變化的時(shí)候赊窥,
會(huì)觸發(fā)OnSignalingMessage
事件爆惧,創(chuàng)造出一個(gè)offer
【SDP描述信息】;有了
offer
【SDP描述信息】之后锨能,
就會(huì)通過應(yīng)用層【Application】扯再,通過信令,
發(fā)送到遠(yuǎn)端【Send offer to the remote peer】址遇;
【SDP描述信息】?jī)?nèi)容:
有哪些音視頻數(shù)據(jù)熄阻,音視頻數(shù)據(jù)的格式分別是什么,傳輸?shù)刂肥鞘裁吹龋?/p>
遠(yuǎn)端收到數(shù)據(jù)后倔约,則根據(jù)
offer
SDP秃殉,
回復(fù)一個(gè)answer
SDP【Get answer from the remote peer】,
交給本地信令浸剩;信令收到遠(yuǎn)端的
answer
SDP之后钾军,
會(huì)把信息傳給本地PeerConnection
【ProcessSignalingMessage
】,
本地PeerConnection
就會(huì)拿到對(duì)方的媒體流信息
绢要、傳輸端口吏恭、傳輸?shù)刂罚?/p>
至此,遠(yuǎn)端和本地就打通連接重罪,
可以相互傳媒體數(shù)據(jù)
樱哼;
-
遠(yuǎn)端數(shù)據(jù)
來的時(shí)候哀九,
PeerConnection
還會(huì)將遠(yuǎn)端的流
添加到Application
中去;
【OnAddStream(注意區(qū)分AddStream)】
參考自: