WebRTC | 原理馅扣、架構(gòu)、框架目錄着降、運(yùn)行機(jī)制差油、核心類、PeerConnection調(diào)用過程等詳解

架構(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è)PeerConnectionFactoryCreatePeerConnectionFactory】蟹肘;

  • PeerConnectionFactory觸發(fā)CreatePeerConnection词疼、
    CreateLocalMediaStreamCreateLocalVideoTrack帘腹、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ù)offerSDP秃殉,
    回復(fù)一個(gè)answerSDP【Get answer from the remote peer】,
    交給本地信令浸剩;

  • 信令收到遠(yuǎn)端的answerSDP之后钾军,
    會(huì)把信息傳給本地PeerConnectionProcessSignalingMessage】,
    本地PeerConnection就會(huì)拿到對(duì)方的媒體流信息绢要、傳輸端口吏恭、傳輸?shù)刂罚?/p>

至此,遠(yuǎn)端和本地就打通連接重罪,
可以相互傳媒體數(shù)據(jù)樱哼;

  • 遠(yuǎn)端數(shù)據(jù)來的時(shí)候哀九,
    PeerConnection還會(huì)將遠(yuǎn)端的流添加到Application中去;
    【OnAddStream(注意區(qū)分AddStream)】











參考自:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唇礁,一起剝皮案震驚了整個(gè)濱河市勾栗,隨后出現(xiàn)的幾起案子惨篱,更是在濱河造成了極大的恐慌盏筐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砸讳,死亡現(xiàn)場(chǎng)離奇詭異琢融,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)簿寂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門漾抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人常遂,你說我怎么就攤上這事纳令。” “怎么了克胳?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵平绩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我漠另,道長(zhǎng)捏雌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任笆搓,我火速辦了婚禮性湿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘满败。我一直安慰自己肤频,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布算墨。 她就那樣靜靜地躺著宵荒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪米同。 梳的紋絲不亂的頭發(fā)上骇扇,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音面粮,去河邊找鬼少孝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛熬苍,可吹牛的內(nèi)容都是我干的稍走。 我是一名探鬼主播袁翁,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼婿脸!你這毒婦竟也來了粱胜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤狐树,失蹤者是張志新(化名)和其女友劉穎焙压,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑钟,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涯曲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了在塔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幻件。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔溃,靈堂內(nèi)的尸體忽然破棺而出绰沥,到底是詐尸還是另有隱情,我是刑警寧澤贺待,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布徽曲,位于F島的核電站,受9級(jí)特大地震影響狠持,放射性物質(zhì)發(fā)生泄漏疟位。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一喘垂、第九天 我趴在偏房一處隱蔽的房頂上張望甜刻。 院中可真熱鬧,春花似錦正勒、人聲如沸得院。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祥绞。三九已至,卻和暖如春鸭限,著一層夾襖步出監(jiān)牢的瞬間蜕径,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工败京, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兜喻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓赡麦,卻偏偏與公主長(zhǎng)得像朴皆,于是被迫代替她去往敵國(guó)和親帕识。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359