自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

火山引擎 RTC 視頻性能降級(jí)策略解析

開(kāi)發(fā)
我們需要適當(dāng)降級(jí)視頻特性來(lái)減輕系統(tǒng)復(fù)雜性,確保重要功能正常使用,提升用戶體驗(yàn)。

一. 背景

隨著 RTC 使用場(chǎng)景的不斷復(fù)雜化,新特性不斷增多,同時(shí)用戶對(duì)清晰度提升的訴求也越來(lái)越強(qiáng)烈,這些都對(duì)客戶端機(jī)器性能提出了越來(lái)越高的要求 (越來(lái)越高的分辨率,越來(lái)越復(fù)雜的編碼器等)。但機(jī)器性能差異千差萬(wàn)別,同時(shí)用戶的操作也不可預(yù)知,高級(jí)特性的使用和機(jī)器性能的矛盾客觀存在。

視頻性能降級(jí)能做什么?

一是解決因設(shè)備性能不足、突發(fā)的性能消耗沖擊(如殺毒軟件)帶來(lái)的用戶音視頻體驗(yàn)問(wèn)題(如視頻卡頓、延時(shí)高、設(shè)備卡死)等問(wèn)題;

二是提升一些高級(jí)功能的滲透率,例如默認(rèn)情況下開(kāi)啟視頻超分,設(shè)備性能不足的情況下主動(dòng)關(guān)閉;

三是降低部分場(chǎng)景的設(shè)備功耗,例如當(dāng)電腦使用電池供電的時(shí)候,通過(guò)關(guān)閉視頻超分、降低視頻幀率等方式主動(dòng)降低一些功耗。

二.  前置基礎(chǔ)

RTC 提供了一種性能降級(jí)機(jī)制,在性能負(fù)載過(guò)高時(shí),觸發(fā)降級(jí);在性能負(fù)載降低后,觸發(fā)升級(jí)。一套完整的性能降級(jí)方案,需要產(chǎn)品具備一些基本的降級(jí)能力,比如:支持動(dòng)態(tài)修改視頻分辨率、幀率,支持發(fā)布多路視頻流(simulcast),支持 SVC,支持按需發(fā)布/訂閱等。

2.1 Simulcast

關(guān)鍵詞:同樣的視頻源,多種分辨率,差異化的分辨率需求

所謂 Simulcast,就是將一個(gè)視頻源輸入編碼輸出成多個(gè)分辨率的視頻幀,在發(fā)送端編碼多路不同分辨率的大小流,下行接收端可以選擇訂閱其中任意一種分辨率的同源視頻流。它可以滿足多人通話場(chǎng)景,不同用戶對(duì)于分辨率的差異化需求。在實(shí)際應(yīng)用中,Simulcast 變得更加靈活多變,發(fā)揮的作用也越來(lái)越大。除了滿足用戶差異化的分辨率需求外,還可以有效解決下行弱網(wǎng)/性能問(wèn)題,提升用戶體驗(yàn)。比如在下行用戶網(wǎng)絡(luò)交較差或者性能較差時(shí),可以給用戶轉(zhuǎn)發(fā)低分辨率的視頻,確保用戶可以擁有流暢的觀看體驗(yàn)。

圖片

2.2 SVC

關(guān)鍵詞:?jiǎn)温妨?,分層編碼

SVC(Scalable Video Coding, 可適應(yīng)視頻編碼)是指,一條視頻碼流可以分成多個(gè)層級(jí)(layer) , 在保證整條流的可解碼性的情況下,用戶可以根據(jù)層級(jí)的優(yōu)先級(jí)選擇丟棄某些層級(jí)的全部或部分片段,得到不同幀率(temporal / 時(shí)域)/分辨率(spatial / 空域)/ 畫(huà)質(zhì)(quality / 質(zhì)量)的視頻流。

圖片

2.3 按需發(fā)布

按需發(fā)布簡(jiǎn)單來(lái)說(shuō),就是讓發(fā)布端知道哪些分辨率的流有人訂閱,哪些分辨率的流沒(méi)人訂閱,然后僅發(fā)布那些有人訂閱的視頻流。用戶沒(méi)有訂閱的流,即使性能或者帶寬再好,也不會(huì)發(fā)送。通常情況下,按需發(fā)布端需要配合 Simulcast 使用,但也不是必要條件。按需發(fā)布的初衷,是為了節(jié)省性能和帶寬資源,減少不必要的資源浪費(fèi)。

圖片

按需發(fā)布

三.  常見(jiàn)的視頻性能降級(jí)手段

RTC 對(duì)于 CPU 和 GPU 的消耗通常較高,并且 RTC 對(duì)于實(shí)時(shí)性有近乎苛刻的要求 (通常 RTC 通話要求在 400ms 以內(nèi),云游戲場(chǎng)景甚至要求 100ms 以內(nèi)),這對(duì)算法處理速度以及平穩(wěn)性有很高的要求。單幀處理耗時(shí)的長(zhǎng)短,意味著視頻幀率的上限,而處理耗時(shí)的平穩(wěn)性,也會(huì)影響視頻流暢性的整體感受(因?yàn)閷?shí)時(shí)性的要求,RTC 通常不會(huì)設(shè)置過(guò)大的 jitter buffer 來(lái)平滑抖動(dòng),當(dāng)幀處理耗時(shí)抖動(dòng)較大時(shí),會(huì)在觀看端感受到類似視頻掉幀一樣的卡頓現(xiàn)象)。除此之外,過(guò)高的系統(tǒng)消耗,甚至?xí)绊懙接脩魧?duì)設(shè)備的正常使用(比如:過(guò)度發(fā)燙/操作延時(shí)卡頓等)。

在視頻通話過(guò)程中,有一些參數(shù)是可動(dòng)態(tài)調(diào)節(jié)的。往往不同的視頻參數(shù)對(duì)應(yīng)著不同的性能消耗。常見(jiàn)的調(diào)節(jié)參數(shù)有視頻分辨率、視頻幀率,除此之外,還可以調(diào)節(jié)視頻處理特性(比如:超分 / 降噪 / HDR 等),甚至還可以切換不同編碼器及檔位,對(duì)于 Simulcast 還可以選擇切流 (Fallback)。

3.1 視頻分辨率降級(jí)

降級(jí)視頻分辨率是指降低視頻的發(fā)送分辨率。通常來(lái)說(shuō),RTC 主要是指編碼分辨率。對(duì)于一些特殊場(chǎng)景,降低視頻分辨率還包括了支持編碼分辨率的回調(diào),采集模塊收到回調(diào)的分辨率后,會(huì)主動(dòng)降低采集模塊輸出分辨率(但通常不會(huì)直接降低 camera 采集分辨率,因?yàn)檎{(diào)整采集參數(shù)會(huì)涉及到攝像頭重啟,切換過(guò)程會(huì)出現(xiàn)黑幀,重啟攝像頭也會(huì)增加出錯(cuò)概率)。這種場(chǎng)景特效分辨率也會(huì)隨之降低,收益最大化。

3.2 視頻幀率降級(jí)

降級(jí)視頻幀率是指降低視頻的發(fā)送幀率。通常來(lái)說(shuō),RTC 主要是指編碼幀率。降級(jí)幀率是最不容易出錯(cuò),并且收益可觀的一種降級(jí)手段。對(duì)于一些特殊場(chǎng)景,還支持編碼幀率回調(diào),采集模塊收到回調(diào)之后,會(huì)主動(dòng)降低采集模塊輸出幀率。

3.3 編碼器降級(jí)

降級(jí)編碼器指,降級(jí)編碼器檔位,或者切換到性能更好的編碼器。通常,編碼壓縮率越高的編碼器,編碼性能消耗越高。因此,當(dāng)系統(tǒng)負(fù)載較高時(shí),可以切換到壓縮率相對(duì)低的編碼器或者編碼檔位,降低性能消耗。

3.4 視頻處理特性降級(jí)

在各業(yè)務(wù)場(chǎng)景下,會(huì)有一些視頻前后處理特性,主要目的是為了提升畫(huà)質(zhì),比如:超分 / 降噪 / HDR 等。在性能足夠好,并且負(fù)載不高的情況下,可以開(kāi)啟這些視頻處理特性,提升用戶體驗(yàn)。當(dāng)系統(tǒng)性能瓶頸時(shí),需要適當(dāng)降級(jí)視頻處理特性,甚至是關(guān)閉特性來(lái)確保正常的視頻通話。

RTC 視頻性能降級(jí)方式及優(yōu)缺點(diǎn)總結(jié):

圖片?

RTC 視頻性能降級(jí)方式及優(yōu)缺點(diǎn)總結(jié)

四. 火山引擎 RTC 性能降級(jí)策略

4.1 性能降級(jí)策略概覽

火山引擎 RTC 降級(jí)策略包括了多種基礎(chǔ)能力和策略:

圖片

火山引擎 RTC 視頻性能動(dòng)態(tài)降級(jí)策略概覽

下面具體介紹幾種降級(jí)策略以及策略中的注意點(diǎn)。

4.2 RTC 編碼組織方式

火山引擎 RTC Simulcast Encoder 之間采用完全并行的編碼方案,每條 Simulcast 流處在不同的 Pipeline 上,線程之間相互不影響。相比 WebRTC Simulcast Encoder 之間串行的編碼方案,并行編碼方案效率更高, 并且編碼效率基本不受 Simulcast 流數(shù)的影響。

對(duì)于性能降級(jí)來(lái)說(shuō),并行編碼組織方式,可以選擇對(duì)單條流進(jìn)行降級(jí),也可以選擇同時(shí)對(duì)所有流進(jìn)行降級(jí),降級(jí)方式變得更加靈活。

圖片

4.3 RTC Simulcast 流降級(jí)方案

因?yàn)榛鹕揭?RTC 編碼器采用并行方案,單路 Simulcast 流的編碼延時(shí)高,降級(jí)可以選擇同時(shí)降級(jí)所有流的幀率,也可以選擇只降級(jí)編碼延時(shí)較高流的幀率,而不影響其他 Simulcast 流。

圖片

火山引擎 RTC 除了降級(jí)單條流之外,還支持 Simulcast 流之間聯(lián)動(dòng)。性能不足時(shí),支持關(guān)閉高分辨率的流(Fallback),性能恢復(fù)時(shí),可以重新開(kāi)啟高分辨率的流。當(dāng)發(fā)生 Fallback 時(shí),訂閱高分辨率的用戶會(huì)自動(dòng)切換為訂閱次高分辨率的流,性能恢復(fù)時(shí),會(huì)重新切換回來(lái)。以下圖為例,如果 720p 流被關(guān)閉,訂閱 720p 的用戶將會(huì)收到最接近 720p 的分辨率的流,所示為 360p。

圖片

火山引擎 RTC 降級(jí)偏向于 畫(huà)面的流暢度和畫(huà)質(zhì)的均衡(升降級(jí)路線可后臺(tái)配置)。

4.4 不同發(fā)布流之間的協(xié)同降級(jí)

在沒(méi)有流之間(比如:屏幕流/視頻流)協(xié)同的情況下,會(huì)存在不同流之間 同升同降 的問(wèn)題。為了更好的解決這類問(wèn)題,也為了更好的處理不同流之間的優(yōu)先級(jí)問(wèn)題,火山引擎 RTC 內(nèi)部采用一個(gè) 性能集中調(diào)控中心,來(lái)處理不同流之間的優(yōu)先級(jí)問(wèn)題。以會(huì)議場(chǎng)景舉例來(lái)說(shuō),我們通常會(huì)認(rèn)為,屏幕共享的優(yōu)先級(jí)比視頻流更高,在性能負(fù)載較高時(shí),我們選擇優(yōu)先把視頻的消耗降低,把資源盡可能讓給屏幕流。只有在視頻流降級(jí)之后,系統(tǒng)負(fù)載依舊較高,無(wú)法滿足性能要求時(shí),才會(huì)降級(jí)屏幕流。

圖片

典型的降級(jí)路徑

典型的降級(jí)路徑是:先對(duì)視頻流降級(jí),再降級(jí)屏幕流;升級(jí)順序和降級(jí)順序正好相反。

4.5 性能和帶寬降級(jí)關(guān)系處理

性能和帶寬是 RTC 系統(tǒng)中最重要的兩種資源。隨著系統(tǒng)運(yùn)行,兩者會(huì)處在不斷的變化中。同時(shí)有性能以及帶寬波動(dòng)的情況下,可能會(huì)出現(xiàn),性能負(fù)載過(guò)高,觸發(fā)降級(jí),但同時(shí)帶寬回升,又會(huì)觸發(fā)升級(jí)。因此,需要有一種機(jī)制保證兩者之間出現(xiàn)“你升我降”的問(wèn)題。火山引擎 RTC 把性能和帶寬控制兩者解耦開(kāi)來(lái),把性能的輸出作為一個(gè)最大限制條件。性能升級(jí)相當(dāng)于是上調(diào)水位線,降級(jí)相當(dāng)于下調(diào)水位線,實(shí)際性能/帶寬升降級(jí)由一個(gè)模塊統(tǒng)一處理。

除了性能和帶寬之外,火山引擎 RTC 還支持按需發(fā)布能力,發(fā)布端結(jié)合三者采用如下方案進(jìn)行綜合決策。

圖片

說(shuō)明:因?yàn)樾阅茉颍?20p 流被關(guān)閉,訂閱 720p 的用戶將會(huì)收到最接近 720p 的分辨率的流,所示為 360p。

4.6 訂閱端的性能降級(jí)

訂閱端性能在某些場(chǎng)景下可能會(huì)成為性能瓶頸,比如多人會(huì)議,或者高分辨率解碼。這種情況下,如果不能有效處理,可能會(huì)導(dǎo)致卡頓/延時(shí)逐漸拉大等問(wèn)題;

火山引擎 RTC 引入訂閱端性能降級(jí)方案,聯(lián)動(dòng)上下行,當(dāng)系統(tǒng)負(fù)載較高或者解碼器延時(shí)較長(zhǎng)時(shí),訂閱端支持動(dòng)態(tài)性能降級(jí)。

1)訂閱端可以根據(jù)流的優(yōu)先級(jí),優(yōu)先選擇降級(jí)低優(yōu)先級(jí)的流,盡可能保證高優(yōu)先級(jí)流的視頻體驗(yàn)。

火山引擎 RTC 支持 API 方式設(shè)置訂閱流的優(yōu)先級(jí)。

2)就單條流來(lái)說(shuō),訂閱端也可以靈活的配置,是優(yōu)先先降級(jí)分辨率還是幀率(后臺(tái)配置)。

圖片

上圖展示了 Client 用戶同時(shí)訂閱 3 條 720p 30fps 的流,但是流的優(yōu)先級(jí)不同,Stream1 為高優(yōu)先級(jí)流,Stream2 / Stream3 為低優(yōu)先級(jí)流。當(dāng)客戶出現(xiàn)性能問(wèn)題時(shí),會(huì)首先降級(jí)低優(yōu)先級(jí)的 Stream2 / Stream3。以上圖為例,Stream2 / Stream3 降級(jí)到了 180p 8fps。優(yōu)先級(jí)最高的 Stream1 沒(méi)有降級(jí)。直到低優(yōu)先級(jí)的流降無(wú)可降,才考慮降級(jí)高優(yōu)先級(jí)的流。

4.7 基于 CPU 使用率的降級(jí)

使用特性處理耗時(shí)(比如:編碼延時(shí)或者視頻處理算法耗時(shí))的最主要的問(wèn)題在于:

  1. 僅能監(jiān)控當(dāng)前特性自身的負(fù)載,如果鏈路其他消耗較高(并且不在監(jiān)控范圍內(nèi)),導(dǎo)致整體負(fù)載過(guò)高時(shí),依舊無(wú)法降級(jí)。
  2. 系統(tǒng) CPU 使用率較高時(shí),無(wú)法退避,導(dǎo)致設(shè)備過(guò)燙,甚至用戶操作受到嚴(yán)重影響。

火山引擎 RTC 支持性能降級(jí)統(tǒng)一調(diào)控方案,可以進(jìn)行上下行聯(lián)動(dòng),也可以對(duì)視頻/屏幕的性能降級(jí)聯(lián)動(dòng)等,甚至可以聯(lián)動(dòng)音頻及網(wǎng)絡(luò)。

圖片

火山引擎 RTC 以流維度拆分成幾個(gè) 降級(jí)單元,單元的排列情況,可以表示優(yōu)先級(jí)(優(yōu)先級(jí)可配置)。

enum RXPerfUnitType {
kRXPerfUnitUnknown = 0,
// 發(fā)布視頻流
kRXPerfVideoPubCamera = 1,
// 發(fā)布屏幕流
kRXPerfVideoPubScreen = 2,
// 發(fā)布投屏
kRXPerfVideoPubScreenCast = 3,
// 訂閱視頻
kRXPerfVideoSubCamera = 4,
// 訂閱屏幕
kRXPerfVideoSubScreen = 5,
};

NOTE: 一個(gè)降級(jí)單元表示一種流類型,一條流內(nèi)部可能有多種降級(jí)手段,比如編碼和視頻處理算法等。

五.  總結(jié)和展望

5.1  總結(jié)

我們?cè)跁?huì)議場(chǎng)景對(duì)上述視頻性能降級(jí)策略進(jìn)行了驗(yàn)證。上線這些策略后,線上高負(fù)載時(shí)間比例持續(xù)優(yōu)化,從整體 9‰ 左右優(yōu)化到 5‰,用戶感受高負(fù)載情況(設(shè)備發(fā)燙、界面響應(yīng)慢、音視頻卡頓、甚至程序崩潰或死機(jī)等問(wèn)題)變少。

當(dāng)前的視頻性能降級(jí)策略也存在一些可以優(yōu)化的地方,比如:

基于 CPU 的性能降級(jí)存在誤傷。類似編譯場(chǎng)景,在 CPU total usage 占用較高,但 App usage 占用很低的情況下,降級(jí)收益很小,但實(shí)際中這種場(chǎng)景可能會(huì)存在;針對(duì)這種場(chǎng)景,應(yīng)該做區(qū)分,不是一味降級(jí),退避是保障在一定的視頻質(zhì)量基礎(chǔ)。

降級(jí)最低視頻質(zhì)量配置可以更靈活。降級(jí)至最低檔位時(shí),應(yīng)該還要關(guān)聯(lián)實(shí)際的發(fā)布訂閱情況來(lái)執(zhí)行。比如,用戶在訂閱 1080p 的流,這時(shí)候降級(jí)到 180p 可能不是一個(gè)很合適的選擇;但如果用戶本身訂閱就是 360p 的流,這時(shí)候降級(jí)到 180p 可能是一個(gè)不錯(cuò)的選擇。后續(xù)將進(jìn)一步探索和優(yōu)化,保證性能滿足要求的情況,質(zhì)量損失最小。

支持基于 GPU 的性能降級(jí)。RTC 場(chǎng)景不光對(duì)于 CPU 的消耗大,對(duì)于 GPU 的消耗同樣也不小。后續(xù)基于 GPU 的性能降級(jí)也將上線。

5.2  展望

未來(lái),火山引擎 RTC 還將支持更多降級(jí)策略,比如超分 / 降噪特性的性能降級(jí)、編碼器降級(jí)等;降級(jí)方案完整性進(jìn)一步提升,比如根據(jù)用戶設(shè)備來(lái)推薦最佳視頻參數(shù);另外,利用火山引擎“數(shù)據(jù)驅(qū)動(dòng)”優(yōu)勢(shì),量化性能數(shù)據(jù),探索性能和帶寬深度融合方案。通過(guò)這些優(yōu)化,更好地平衡高級(jí)特性的使用和機(jī)器性能的矛盾客觀存在,為用戶帶來(lái)更好的體驗(yàn)。

六.  加入我們

火山引擎 RTC,致力于提供全球互聯(lián)網(wǎng)范圍內(nèi)高質(zhì)量、低延時(shí)的實(shí)時(shí)音視頻通信能力,幫助開(kāi)發(fā)者快速構(gòu)建語(yǔ)音通話、視頻通話、互動(dòng)直播、轉(zhuǎn)推直播等豐富場(chǎng)景功能,目前已覆蓋互娛、教育、會(huì)議、游戲、汽車(chē)、金融、IoT 等豐富實(shí)時(shí)音視頻互動(dòng)場(chǎng)景,服務(wù)數(shù)億用戶。

責(zé)任編輯:龐桂玉 來(lái)源: 字節(jié)跳動(dòng)技術(shù)團(tuán)隊(duì)
相關(guān)推薦

2024-07-18 21:26:44

2022-08-19 18:15:04

視頻會(huì)議音頻質(zhì)量噪聲

2022-12-07 19:24:33

2022-09-30 15:15:03

OpusRTC 領(lǐng)域音頻編碼器

2023-05-31 14:54:32

2023-08-23 14:53:05

火山引擎視頻云視頻編解碼

2021-11-11 20:49:22

數(shù)字化

2021-08-31 16:17:50

數(shù)字化

2021-09-23 19:31:00

AI

2021-07-26 21:16:50

計(jì)算

2009-04-09 09:01:08

Windows 7微軟操作系統(tǒng)

2022-09-15 17:37:40

網(wǎng)絡(luò)傳輸鏈路數(shù)據(jù)包數(shù)據(jù)擁塞
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)