文章插圖

文章插圖
為了保證音視頻的質量,WebRTC底層做了大量的工作,尤其是網絡傳輸與服務質量,更是其核心技術,本文由北京音視跳動科技有限公司 首席架構師 李超在LiveVideoStack線上分享的演講整理而成,詳細解析了WebRTC底層技術與優化在網絡質量、傳輸實時性與服務質量之間的矛盾以及平衡之道 。
作者 | 李超非常高興和大家一同探討WebRTC傳輸是如何保證音視頻服務質量的 。
整理 | LiveVideoStack
1. 實時通信的目標
1.1 實時通信的目標是什么?
1.2 線上與現在不同的原因
1.3 實時通信的目標
2. 幾個重要指標
2.1 幾個重要指標
最為關鍵的是實時通信的延遲指標,只有將延遲指標搞清楚,才能知道做實時通信時,達到怎樣的延遲才算符合要求的,即接近面對面交流的效果 。然后是音視頻服務質量指標,延遲指標達到后,再根據這項指標判斷音視頻服務質量的好壞 。
2.2 實時通信延時指標
所以最關鍵的一級是500ms,只有延遲低于500ms,才可以說是合格的實時互動系統 。
2.3 音頻服務質量指標
2.4 視頻服務質量指標
【服務質量差距分析模型 服務質量評價模型】從以上可以看到,在保證傳輸的實時性時,由于帶寬是一定的,可能會犧牲一定的服務質量 。
3 主要矛盾
3.1 實時通信與服務質量的矛盾
第一,碼流與帶寬之間的矛盾 。要想達到好的質量,碼流一般會比較大(當然,不能超過最大碼流),而帶寬是有限的,于是碼流和帶寬之間就會產生矛盾;第二,實時性和服務質量之間的矛盾 。通常為了保證好的實時性我們會選擇UDP,而UDP不保證網絡傳輸的可靠性,丟包、亂序是經常發生的 。一旦出現丟包、亂序,網絡傳輸質量就無法得到保證,最終會影響到音視頻的質量 。
4 解決矛盾方法
4.1 解決矛盾的方法
5 保障數據的實時性
對于WebRTC來說,為了保障數據的實時性,提供了兩種方法:一種是傳輸路徑的選擇,它首先會選擇最佳的傳輸路徑,使得端到端傳輸時采取最好、最短的傳輸路徑從而保障數據傳輸的實時性;另一種是傳輸協議的選擇,可以選擇TCP或者UDP 。下面咱們先看一下WebRTC是如何選擇最佳傳輸路徑的 。
5.1 選擇一條最好的路徑
5.2 使用TCP還是UDP?
5.3 為什么極端網絡環境下不能用TCP?
圖中顯示了多次丟包時的延遲情況:從客戶端向服務端發送數據包,服務端需要返回ACK消息進行確認; 客戶端收到確認消息后, 才能繼續發送后面的數據(有滑窗時也是類似的) 。每次客戶端發完數據后,都會啟動一個定時器,定時器的最短超時時間是200ms 。如果因某種原因,在200毫秒客戶端沒有收到返回的ACK包,客戶端會重發上一個包 。由于TCP有退避機制,以防止頻繁發送丟失包,因此會將重發包的超時時間延長到400ms 。如果重發包依然沒有收到確認消息,則下一次重發的超時時間會延長到800ms 。我們可以看到,連續幾次丟包后,就會產生非常大的延遲,這就是TCP在弱網環境下不能使用的根本原因 。
5.4 選擇UDP帶來的問題
6 如何提高網絡質量
6.1 網絡質量包含哪些指標
要想解決網絡質量,首先要知道影響網絡質量的幾個因素:它包括了丟包率、延遲時間、抖動、亂序 。如果網絡丟包率低、延遲時間小、不抖動、不亂序,這就是非常優質的網絡啦 。但如果丟包率很高,那么網絡質量一定會很差 。
6.2 造成丟包的原因
6.3 減少丟包的方法
6.4 NACK
6.5 NACK適合使用的場景
所以可以得出結論,丟包重傳僅適用于網絡傳輸時延比較小的情況,如果RTT比較大時,就不適合使用丟包重傳來保障網絡質量了 。
6.6 FEC
在圖中我們可以看到,Data1和Data2同時發送到對端,在發送時對它們做一下異或操作,即Data1的最后一位0與Data2的最后一位0異或為0,Data1的倒數第二位1與 Data2的倒數第二位1異或為0,依次類推,最后就產生了冗余數據R,同時將三個包從一端傳輸到另一端 。傳輸過程中,如果Data1丟失,通過Data2和冗余包R就可以將Data1找回來 。找回包的算法也是異或操作,即在接收端將Data2的每一位與冗余包中的相同位進行異或操作就算出了Data1 。這就保證了不用重新請求,就將丟失包找回的作用 。
而且異或具有傳遞性,A、B、C三個包可以同時異或得到D,如果其中任意一個包丟失,可以通過D和其它包找回丟失的包 。
6.7 ULPFEC
6.8 FlexFEC
此時,當4和5同時丟失時,通過1、7和C1可以找到4,2、8和C2可以找到5,這樣就可以找回連續的兩個丟包 。當然它也有弊端,其弊端是無法處理批量的連續丟包,例如連續丟失了10個包,FlexFEC對這種情況也無能為力 。
以上就是WebRTC對于丟包的解決方法,通過“NACK+FEC”防止丟包 。
6.9 如何解決抖動和亂序
WebRTC處理抖動和亂序使用的是JitterBuffer和NetEQ 。JitterBuffer用于處理視頻包,NetEQ用于處理音頻包 。它們的原理大致相同(NetEQ更為復雜一些),都是通過一個隊列(緩存區)對接收到的數據做下緩沖,然后再從隊列的另一端將數據包一個個均勻的取出, 這樣取出的數據就是平滑的了 。
對于亂序的處理也比較好解決,如圖中所示,每個RTP包進來的時候有一個序號(Sequence Number),在數據進入隊列時,它會根據序號插到對應的位置上,比如圖中104、107包已經到達,并且在對應的位置上,而103、105和106沒來,位置就空著,等它們來了再插入對應的位置,這樣就可以防止亂序,所以通過JitterBuffer和NetEQ就可以同時解決亂序和抖動了 。
總結一下,NACK和FEC解決丟包問題,NACK會增加時延,FEC會占用帶寬 。JitterBuffer解決視頻的亂序與抖動,NetEQ解決音頻的亂序與抖動 。
6.10 網絡延時產生的原因
所以對于延時來說,我們需要解決的是因擁塞而造成的延時,鏈路問題無法解決 。下面咱們就來看看WebRTC是如何防止擁塞的 。
7 準確的帶寬評估方法
7.1 如何解決抖動和亂序
7.2 基于丟包的帶寬評估
7.3 基于延時的帶寬評估
而基于延時的帶寬評估就不會產生這種情況 。它的基本原理是,如果接收到的數據包的網絡傳輸時延在持續增長,就說明網絡變差了,當達到一定程度時,就要將評估的帶寬值降下來,以防止發生網絡擁塞 。它的計算公式是根據狀態機來的(狀態機比較復雜,我這里就不講了),當狀態非常好時,需要增加帶寬,同丟包增加帶寬一樣,每次增加8%;如果延時一直累加,則需要降低帶寬,帶寬降為原來85%,其它情況就保持當前帶寬,無增無減 。
8 媒體數據與帶寬的平衡
8.1 媒體數據與帶寬的平衡
帶寬評估方法和網絡質量的提升在前面我已經介紹了 。在有限的帶寬下,如何才能提供更好的音視頻服務質量,是人們一直孜孜不倦追求的目標 。因此在同等條件下,可以將數據壓縮的更小,一直是解決服務質量的一種關鍵方法 。目前最常用的視頻編碼器還是H.264,不過新的編碼器已經有了很大突破VP9/H265、AV1/H266提供了更高的壓縮率,這使得我們在網絡條件有限的情況下,可以傳輸更多的數據從而保障更好的服務質量 。
另一方面,在帶寬相同且碼流無法壓縮的情況下,還可以采用動態碼率 。通常,在使用動態碼率時,我們可以直接從產品上看出來,你會發現視頻一會兒清晰,一會兒模糊 。即在帶寬小時,編碼器壓縮碼流,此時視頻變得模糊;帶寬大時,編碼器放大了碼流,所以視頻變得清晰 。以上就是通過減少數據量的方法來保障實時通信質量的 。
8.2 Simulcast與SVC
SVC與Simulcast最大的區別:SVC上傳的是一路碼流,但這一路碼流是由多層構成的 。服務端會按照不同接收端的帶寬大小,選擇傳輸不同的層 。如上圖所示,手機端帶寬小,就傳輸小的一層數據,PC端帶寬大,就將所有層全部傳輸過去;而Simulcast上傳的是多路流,一般分為小、中、大三路 。對手機端傳輸小的一路,對PC端傳輸最大的一路 。Simulcast的好處在于,每一路流都是獨立的,所以可以對每一路流使用硬件編解碼器,而 SVC的分層方式目前沒有硬件支持,所以無法通過硬件加速 。
8.3 流控
正如我前面所說的,流控雖然防止了網絡擁塞的發生,但會增加一些延時,增加的延時最終會反應到實時通信的總指標里,總的延時必須控制在500ms以內 。比如以前端到端時延是200ms,由于帶寬不足,時延增加到300ms、400ms都是可以的,但一定不要超過500ms 。
此外,對于編碼器的輸出碼流來說,如果流控通過直接降低碼流仍然不能與帶寬適配時,還可以通過降低分辨率的方式來降低碼流 。總之,在帶寬不足時,要想盡辦法減少數據量 。實在不行,也可以關掉視頻只保留音頻來保障網絡的暢通 。
9 總結
以上就是本次分享的全部內容,謝謝!
Q&A (部分)
1. 路徑的選擇是WebRTC內部自動選擇的嗎?
是自動選擇的 。WebRTC會自動判斷通信的雙方是否在同一個局域網內,如果是就直接在局域網內建立連接;如果不是,會通過STUN協議獲取各自的外網地址,然后進行NAT穿越;如果還不成功的話,才會選擇TURN服務進行數據中轉 。
2. WebRTC網絡傳輸質量衡量指標有什么?
衡量任何一個實時傳輸系統時,首要看它的時延是否達到500ms以內 。其實500ms對于實時通信而言,也是比較苛刻的標準了,因為網絡的變化是非常大的, 所以要實現這個指標其實難度也是蠻大的 。其次是丟包率,這是非常關鍵的指標,剛才說到2%的丟包率代表網絡比較好;小于10%,對于WebRTC來說,代表目前的帶寬是準確的;超過10%則代表發生了擁塞 。有些廠商說它的產品可以抗xx%的丟包,這樣的前提是不認為丟包是一個指標,但在真網絡中,當路由的緩沖被撐爆后,必然會出現大量丟包,如果不把丟包當作指標的話,就缺少了一種判斷網絡擁塞發生的條件,這顯然是不合理的 。
3. 視頻JitterBuffer怎么具體控制平滑的?
其實JitterBuffer平滑處理的難度并不像我們想像的那樣復雜,之所以大家認為它復雜,可能是因為一些額外的因素,如還要處理音視頻同步等問題 。對于平滑處理,我們完全可以自己通過一個Buffer來實現 。Buffer可以是動態大小或固定大小 。為了簡化,我們假設它是固定大小,比如定義一個可以存放 100 個元素的數組,在數組的一頭每隔 10 毫秒取一個包,這就是一個最簡單的平滑處理 。當然更好的方式是可以根據網絡的變化讓這個平滑數組的大小也動態變化,這樣就更高級一些 。當然,如果Buffer是動態變化的,那在計算平滑數組的動態大小時,會稍難一些 。
4. WebRTC要和SIP客戶端通訊有什么好的方案?
一般與SIP通信最好借助流媒體服務器比如Janus,它既支持SIP協議也能支持WebRTC客戶端 。這樣SIP終端就可以將數據傳輸流媒體服務器,然后再轉發給WebRTC終端了,同理WebRTC終端也可以通過流媒體服務器與SIP終端通信了 。
5. FEC和NACK默認是不是都要開啟?
是的 。對于WebRTC來說,FEC和NACK都是開啟的,也可以控制它們的開關 。
6. 能說下為什么TCC比REMB準確嗎?
TCC和REMB主要有兩個區別 。第一是計算的端不同,REMB是在接收端計算的,接收端計算后再將結果返回給發送端進行控制,而在回傳結果時,可能網絡又發生了新的變化,這就造成了REMB的及時性不夠;TCC是將所有數據都交給發送端做計算和控制,因此及時性和準確度會更高 。第二是濾波器不同,REMB是卡爾曼濾波器(Kalman),TCC是最小二乘法濾波器(Trend line) 。最小二乘法濾波器在網絡延時評估這方面比卡爾曼濾波器效果更好一些 。
7. 在內網環境下p2p想讓延時盡可能小,可以做哪些工作?實驗室環境最小延時可以達到100ms以下嗎?
如果在同一個局域網內,實際只有幾十毫秒的延遲 。有同學可能會疑惑,有的產品在同一局域網內延遲非常小,為什么用WebRTC反而延遲增大了?這就是因為WebRTC為保障網絡質量,在內部通過多種機制,各種緩沖,來做到的 。所以它必然會產生一定的延遲,也就是拿延遲換質量 。而在局域網內,網絡基本沒有延時,不丟包、不抖動、不亂序 。這時什么策略都不采用,網絡的傳輸才是最快的,因此在內網通信時,WebRTC的實時性一定不如什么策略都不加的產品好 。
8. ULPFEC和FLEXFEC區別是?
ULPFEC只能進行單向冗余處理,而FLEXFEC可以進行雙向冗余處理,即可以橫向分組還可以縱向分組做冗余,所以它的抗丟包性要比ULPFEC好,同時占的帶寬也比ULPFEC多 。
9. 可靠性這塊,UDP上的WebRTC做ack是自己封裝了seq嗎?然后,一樣需要ack重傳的話,跟TCP SACK有什么區別呢?
WebRTC使用的是RTP協議傳輸數據 。RTP協議中有seq字段 。此外,WebRTC用的NACK與TCP的ACK機制不同 。TCP每一塊數據都需要通過ACK進行確認,如果沒收到ACK就重發,直到成功收到ACK或斷連;而NACK允許丟包,當重傳多次不行時,就不傳了 。且而即使重傳了數據包,在接收端發現它已經過期時,也會將其丟掉 。
10. WebRTC后面會用QUIC協議嗎?
這個問題爭論較大 。WebRTC也在一直在嘗試使用QUIC協議,從我的角度來看,QUIC協議最主要的是解決Http3,Http3解決的是TCP的問題,就要保證數據的可靠性,那么實時性就會受到影響,什么時候QUIC如果可以解決好實時性問題就可以用,反之則不能 。
從我的角度看,一種協議最好只解決一件事兒,很難通過一套協議解決所有問題 。
- 用戶研究:如何做用戶畫像分析-簡書 什么叫用戶畫像分析
- 如何分析項目的可行性 項目可行性分析分哪些方面?
- 產品對比分析報告怎么做 同類產品對比分析報告模板
- 畢業設計選題系統可行性分析 畢業設計選題系統的設計與實現
- 固定資產報表分析是會計師還是經濟師 固定資產報表怎么分析
- 完整設計方案 物聯網應用案例分析報告 物聯網應用案例分析
- 外匯交易分析軟件排名 最好用的外匯行情軟件
- 蘇寧易購財務報表分析2017年—2019年 蘇寧易購財務報表分析論文3000字
- 電子商務客戶關系管理的特點分析 電子商務客戶關系管理的特點有哪些
- 喜歡冷暴力的人不適合談戀愛 戀愛冷暴力的人性格分析
