做者:網易雲信資深客戶端開發工程師 陶金亮html
近幾年,實時音視頻領域愈來愈熱,業界不少音視頻引擎都是基於 WebRTC 進行實現的。本文主要介紹 WebRTC 在視頻輔流上的需求背景以及相關技術實現。算法
WebRTC 中的 SDP 支持兩種方案: PlanB 方案 和 Unified Plan 方案。早期咱們使用多PeerConnection的 Plan B 方案中只支持一條視頻流發送,這條視頻流,咱們稱之爲」主流」。目前咱們使用單 PeerConnection 的 Unified Plan 方案,新增一條視頻輔流,何爲視頻」輔流」?視頻輔流是指第二條視頻流,通常用於屏幕共享。性能優化
隨着業務的發展,一路視頻流知足不了更多實際業務場景的需求,例如在多人視頻聊天、網易會議以及其餘在線教育場景下,須要同時發送兩路視頻流:一路是攝像頭流,另外一路是屏幕共享流。服務器
可是,目前使用 SDK 分享屏幕時,採用的是從攝像頭採集通道進行屏幕分享。在該方案下,分享者只有一路上行視頻流,該場景中要麼上行攝像頭畫面,要麼上行屏幕畫面,二者是互斥的。架構
除非實例一個新的 SDK 專門採集併發送屏幕畫面,但實例兩個 SDK 的方案在業務層處理起來十分麻煩且會存在許多問題,例如如何處理兩個流間的關係等。併發
在 WebRTC 場景中,還存在一種能夠單獨爲屏幕分享開啓一路上行視頻流的方案,並稱之爲「輔流(Substream)」。輔流分享即共享者同時發佈攝像頭畫面和屏幕畫面兩路畫面。ide
另外,有了這個輔流的通道,當設備爲新版本 iPhone(新版本 iPhone 具備同時開啓先後攝像頭的能力)時,也爲支持先後2路攝像頭髮送視頻數據奠基了基礎。性能
前期 SDK 的架構設計是一個多 PeerConnection 的模型,即:一個 PeerConnection 對應一路音視頻流。隨着新的 SDP(Session Description Protocol)格式(UnifyPlan)的推出和支持,一個 PeerConnection 能夠對應多路音視頻流,即單 PeerConnection 模型,即基於單 PC 的架構,容許建立多個 Transceiver,用於發送多條視頻流。測試
目前視頻流主要分爲三類:Camera 流、屏幕共享流、自定義輸入視頻流,分別有不一樣屬性:優化
因爲 iOS 屏幕共享的特殊性,其須要經過自定義視頻輸入的方式來獲取視頻數據,所以存在以下圖所示的流程圖:
綜上所述:iOS 的自定義輸入既可使用主流的通道發送視頻(非屏幕共享),也可使用輔流的通道發送視頻(屏幕共享)。
若是是其餘平臺,例如 Mac、Win、Aos 等,則會相對簡單,攝像頭數據和屏幕共享的數據都來自於 SDK 內部,外部自定義視頻輸入的數據纔來自於外部。
上述提到的單 PC 架構,目前會有2個 RtpTransceiver,一個是 AudioTransceiver,一個是 VideoTransceiver,而輔流的屏幕共享會在新增一個 RtpTransceiver。一個 VideoRtpSender 會包含一個 VideoMediaChannel。
實現輔流須要對不一樣層面都作一些調整以及重構,具體以下:
下面介紹在整個過程當中,比較重要的幾個技術點的實現。
在弱網狀況下,須要視頻輔流的時候,咱們會優先把碼率分配給音頻流,其次是輔流,最後再分配給主流,總體策略爲保輔流。
帶寬分配的主要流程以下:
具體過程如圖所示:
輔流會在上圖的基礎上再新增一個 VideoSendStream。
目前關於碼率分配的流程以下圖所示,歸納起來有一下幾步:
爲了實現視頻輔流的功能,咱們須要對擁塞控制進行相關的改動,主要經過如下四個方面的改動來實現:
按照 RFC 2327,使用 "b=< modifier >:< bandwidth-value >" 的方式來指定建議帶寬,有兩種 modifier(修飾符):
目前 SDK 使用 b=AS: 的方式指定攝像頭碼流或屏幕共享碼流的建議帶寬,並把這個值做爲 CC 模塊的估計值上限。
新的需求要求在同一會話中,可同時發送攝像頭碼流和屏幕共享碼流,所以應把兩路媒體的建議帶寬值相加獲得整個會話的建議帶寬值,做爲 CC 模塊的估計值上限。
WebRTC 支持 b=AS: 方式(單路媒體),在 WebRTC 內部對多路媒體進行相加處理便可知足需求,而 WebRTC 目前不支持 b=CT: 方式,因此建議使用 b=AS: 方式,改動相對較少。
Pub 碼流能力更新,經過 SDP 方式 (b=AS:) 同步設置"最大帶寬"到 CC 模塊,當新增一路媒體流時,經過啓動 probe 快速探測的方式,迅速上探到可用帶寬:
忽然增長一路媒體流時,須要可以很快上探到真實帶寬值,使用 probe 快速探測算法實現這一目標:
下圖爲實際進行碼率分配測試的結果展現:
帶寬的統計上報分爲兩個部分,分別是從 MediaInfo 獲取以及 Bweinfo 獲取。
一、發送端和接收端 MediaInfo 獲取
當前 SDK 的帶寬估計從 MediaInfo 獲取邏輯爲:
主流和輔流同時發送場景,只是增長了一個 transceiver,所以此邏輯適用於主流和輔流同時發送的場景,以下圖:
二、帶寬估計信息獲取
當前 SDK 的帶寬估計從 Bweinfo 獲取邏輯:
主流和輔流同時發送的場景只是增長了 transceiver,所以此邏輯適用主流加輔流同時發送場景,以下圖:
以上就是關於 WebRTC 中視頻輔流的分享,主要從業務需求出發,經過技術背景以及關鍵技術類圖,詳細分享了關於視頻輔流的技術實現。也歡迎留言與咱們交流關於 WebRTC 以及音視頻相關技術。