摘要:?這一次的世界杯,與以往世界杯最大的區(qū)別在于,有很多互聯(lián)網(wǎng)用戶觀看直播,而不是在電視上。在互聯(lián)網(wǎng)觀看直播,互聯(lián)網(wǎng)的網(wǎng)絡(luò)條件不一樣,觀眾會(huì)看不同碼率的視頻。所以主要分享下阿里云在直播中怎么做碼率控制。
在本月的重慶云棲大會(huì)飛天技術(shù)匯專場(chǎng)中,阿里云高級(jí)算法專家黃海宇分享了題為《超大規(guī)模直播碼率控制》的議題,從生產(chǎn)的鏈路角度來說世界杯怎么讓觀眾看到更加清晰的視頻。
這一次的世界杯,與以往世界杯最大的區(qū)別在于,有很多互聯(lián)網(wǎng)用戶觀看直播,而不是在電視上。在互聯(lián)網(wǎng)觀看直播,互聯(lián)網(wǎng)的網(wǎng)絡(luò)條件不一樣,觀眾會(huì)看不同碼率的視頻。所以主要分享下阿里云在直播中怎么做碼率控制。
分享分三個(gè)部分,首先討論一下為什么要關(guān)注碼率控制、其次是宏觀上怎么做碼率控制,最后是介紹下微觀上怎么做碼率控制。
為什么我們要關(guān)注碼率控制
我們先看一下個(gè)直播的一個(gè)簡(jiǎn)單的過程。
世界杯通常會(huì)拿到一個(gè)非常高清的直播源,它的碼率非常大,不太適合在互聯(lián)網(wǎng)上直接傳輸。所以整條鏈路中會(huì)有一個(gè)視頻內(nèi)容的再生產(chǎn)的過程,這個(gè)再生產(chǎn)的過程最重要的就是視頻的轉(zhuǎn)碼,將這個(gè)轉(zhuǎn)成不同分辨率的幾個(gè)檔位。比如說我們看視頻有流暢的、標(biāo)清、高清、超清的視頻,這些都是為了讓不同網(wǎng)絡(luò)的用戶可以流暢的觀看視頻。在進(jìn)行轉(zhuǎn)碼以后,視頻流會(huì)經(jīng)過CDN放大,很多用戶會(huì)進(jìn)行觀看。
其中,碼率控制是發(fā)生在轉(zhuǎn)碼這個(gè)環(huán)節(jié),就是把高清視頻進(jìn)行解碼再進(jìn)行重新編碼,視頻的轉(zhuǎn)碼是一個(gè)有損的壓縮的過程,把原來的視頻進(jìn)行處理,將里面的細(xì)節(jié)進(jìn)行忽略,這樣能夠以一個(gè)更低的帶寬去滿足用戶播放流暢的需求。
碼率控制有什么影響
第一,碼率控制對(duì)清晰度有影響。我們通常的概念是清晰度越高碼率越高,要求用戶的下行的帶寬更高。
第二,碼率控制影響用戶流暢度的影響,用戶播放的網(wǎng)絡(luò)各不相同,當(dāng)用戶的帶寬大于視頻碼率時(shí),才夠流暢播放。
第三,碼率控制的影響是成本的影響,在整個(gè)世界杯直播的過程中,最大的費(fèi)用在CDN帶寬上,CDN的總帶寬消耗為不同的碼率以及這種碼率并發(fā)在線人數(shù)的乘積之和。
所以我們的問題是用戶的網(wǎng)絡(luò)是有限的,我們?nèi)绾卧谟邢薜木W(wǎng)絡(luò)下最好的控制碼率,提供給用戶最清晰的視頻。
宏觀碼率控制
下圖是一個(gè)在世界杯期間直播的例子,左邊是另外一個(gè)直播平臺(tái)做的一個(gè)視頻直播,右邊是優(yōu)酷上面的??梢郧宄目吹阶筮叺囊曨l在搶角球的場(chǎng)景是很模糊的,而右邊的視頻是看起來比較光滑和細(xì)膩的,這兩個(gè)視頻是相同的碼率,左邊是1080P的2.5M,右邊是720P的2.5M,但是為什么會(huì)出現(xiàn)這樣的場(chǎng)景?
我們先看一下整個(gè)視頻編碼的過程是怎么樣的:
下圖上面這條線是一個(gè)1080P的視頻轉(zhuǎn)成1080P的視頻進(jìn)行播放的一個(gè)流程,首先是解碼,這一步是不會(huì)有視頻清晰度的損失的;然后是視頻的編碼,比如說一個(gè)視頻25幀,需要把這25幀的圖像編碼成3M的1080P的圖像,在這個(gè)過程中,為了保證輸出碼率為3M,有大量的細(xì)節(jié)損失;第三步是這個(gè)視頻經(jīng)過了CDN網(wǎng)絡(luò)的傳輸?shù)竭_(dá)用戶的播放器,用戶會(huì)進(jìn)行解碼播放,這一步是沒有信息的損失。最后一步是播放器的渲染,這一步也沒有信息損失。
我們?cè)賮砜?20P轉(zhuǎn)碼,經(jīng)過1080P的視頻解碼,下采樣到720P,720P編碼,傳輸,解碼,最后在播放器端進(jìn)行上采樣,重新編成1080P以及渲染的過程。這個(gè)過程中有兩次的視頻清晰度的損失,第一次是發(fā)生在上采樣以及下采樣的過程中,這個(gè)信息實(shí)際上是一個(gè)固定的損失,它和我們的采樣算法有關(guān)系;第二是在720P的圖像編碼成3M的視頻中發(fā)生的。為什么1080P不如720P清晰,是因?yàn)樵?20P編碼中,我們可以把720P的每一個(gè)象素都描述得非常清晰,這部分的信息損失加上采樣的信息損失只和小于1080P編碼時(shí)的信息損失。
所以總結(jié)一下我們需要控制碼率。碼率控制的目的就是在一定的帶寬條件下,需要使每一個(gè)比特都能夠發(fā)揮它的作用,把它分配到最需要他的地方,從而提升用戶的觀看體驗(yàn)。
說到把每一個(gè)比特分配到最需要它的地方,通常會(huì)有很多方式,在整個(gè)編碼過程中什么地方有信息的損失,就可以在哪里做。比如:
第一是在分辨率做文章,對(duì)給定的碼率,可以選擇不同的分辨率進(jìn)行調(diào)整。
第二是在幀率做文章,對(duì)給定的碼率,可以選擇不同的幀率。
第三是在視頻中碼率在不同的幀間進(jìn)行碼率分配,對(duì)于復(fù)雜的場(chǎng)景,分配更多碼率,對(duì)于簡(jiǎn)單的場(chǎng)景,分配較少的碼率。
第四是在幀內(nèi)進(jìn)行碼率分配,在一幀之內(nèi),根據(jù)圖像的復(fù)雜程度和人眼敏感程度進(jìn)行碼率分配。
在世界杯實(shí)現(xiàn)的場(chǎng)景中,要考慮到播放器的兼容性,使用的是分辨率、幀間碼率,幀內(nèi)碼率的優(yōu)化手段。
宏觀碼率控制——分辨率
首先看一下在宏觀的碼率選擇上,如何去根據(jù)碼率選擇一個(gè)最佳的分辨率。
這是一個(gè)對(duì)世界杯的視頻做的試驗(yàn),采用不同的分辨率來進(jìn)行編碼,相同的碼率進(jìn)行編碼。上圖可以看到信息的損失量,我們可以在相同的碼率下,隨著我們的分辨率的增高,實(shí)際上視頻的清晰度逐漸升高。到了一個(gè)最高點(diǎn)以后,反而會(huì)由于視頻的分辨率的增加,它的清晰度會(huì)降低。這也驗(yàn)證了之前我們看到例子。
所以根據(jù)這樣一條曲線可以得到分辨率和碼率的模型,對(duì)于任何一個(gè)分辨率可以找到一個(gè)最佳的碼率。在實(shí)際上世界杯的這個(gè)場(chǎng)景中,我們把視頻分成了很多碼率,在給定的任意一個(gè)碼率上我們都能找到相應(yīng)的分辨率。
如果關(guān)注過阿里云的直播,會(huì)看到轉(zhuǎn)碼的建議上會(huì)給出很多不常見的分辨率,比如說432P、648P這樣的分辨率,這些分辨率通常能在相應(yīng)檔位的碼率上得到很好的清晰度。
微觀碼率控制——幀間碼率
說到微觀上的碼率控制的時(shí)候,第一件事情就是如何將碼率在很多幀間進(jìn)行分配。
上圖給出了多種碼率分配的算法,第一個(gè)算法是傳統(tǒng)的CBR,就是說不管視頻的變化是怎么樣,統(tǒng)一采用相同的碼率對(duì)視頻進(jìn)行編碼,盡量做到每一秒的碼率是相同的。CBR是途中的紅線,我們可以看到實(shí)際上視頻清晰度的損失波動(dòng)非常大,在紅線中可以看到高的時(shí)候可以非常高,低的時(shí)候非常低。在播放的時(shí)候肯定不希望能夠看到一個(gè)清晰度劇烈抖動(dòng)的視頻,這對(duì)人眼的觀看是極其糟糕的,于是我們嘗試用一種叫CQP的方式進(jìn)行視頻編碼,這實(shí)際是確定了視頻編碼的量化步長(zhǎng),這個(gè)情況下可以得到清晰度相對(duì)穩(wěn)定的視頻。但是采用這種編碼不是沒有代價(jià)的,采用CBR時(shí)碼率比較穩(wěn)定,但是采用CQP,在畫面比較復(fù)雜的地方,為了把這個(gè)清晰度提高,碼率就會(huì)非常高,可以看到,在右圖中,CQP(綠線)的碼率飆到了12mbps,這對(duì)普通用戶來說顯然是不可以接受的。所以最終采用了VBR+VBV的方式。當(dāng)使用VBR+VBV的控制策略以后,藍(lán)線比紅線的碼率質(zhì)量波動(dòng)會(huì)稍微好一點(diǎn),VBV模型也能保證用戶帶寬在達(dá)到VBV指定最大碼率時(shí),視頻一定能夠流暢播放。
VBR的煩惱
VBR在大規(guī)模直播中也會(huì)帶來一些問題,這張圖是在世界杯的開幕式的時(shí)候一張CDN的帶寬的分布圖,橫坐標(biāo)是時(shí)間,縱坐標(biāo)是CDN的帶寬。
這個(gè)圖就可以看到兩個(gè)非常明顯的波動(dòng),第一個(gè)發(fā)生在中場(chǎng)休息,第二個(gè)發(fā)上在23:00,開幕式結(jié)束,比賽正式開始前。第一個(gè)波動(dòng)很好解釋,因?yàn)橹袌?chǎng)休息時(shí)很多觀眾離開,中途的精彩進(jìn)球會(huì)回來一部分觀眾,下半場(chǎng)開始又有很多觀眾繼續(xù)觀看。在前面的波谷就不太好解釋了,通過觀察了碼率的分布圖,我們發(fā)現(xiàn)當(dāng)時(shí)碼率非常低,實(shí)際上,在這段時(shí)間正好是普京講話,這是一個(gè)相對(duì)靜止的畫面,由于采用了VBR,碼率發(fā)生了劇烈的波動(dòng),從而引起帶寬劇烈波動(dòng)。
這種波動(dòng)對(duì)通常的直播是沒有問題的,不同的用戶在看不同的直播,所以碼率的峰值疊加起來會(huì)趨向于碼率的平均值。但是世界杯的場(chǎng)景下,有70%的流量都觀看相同的直播內(nèi)容, CDN的帶寬非常高,這使得CDN的帶寬隨著碼率的波動(dòng)而波動(dòng)。通常的CDN通常會(huì)使用當(dāng)前的水位來評(píng)估一個(gè)新進(jìn)用戶應(yīng)該放在什么CDN節(jié)點(diǎn),或者說根據(jù)一些歷史的狀況估計(jì)CDN放在什么節(jié)點(diǎn)。在世界杯中,這個(gè)問題通過CDN引入新型的調(diào)度策略來解決。
幀內(nèi)碼率分配
幀內(nèi)碼率分配考慮的是如何在一幀圖像內(nèi)對(duì)碼率分配,以得到最好的視覺效果,我們會(huì)根據(jù)人眼的關(guān)注點(diǎn)來調(diào)整碼率分配。在上圖中,人眼關(guān)注的重點(diǎn)毫無(wú)疑問是梅西的頭像,人眼可能會(huì)對(duì)后面虛化的內(nèi)容不關(guān)注。所以在做轉(zhuǎn)碼處理的時(shí)候,會(huì)優(yōu)先考慮這個(gè)圖像的聚焦區(qū)在那里,在這些地方提高它的碼率。另一方面,人眼對(duì)規(guī)則的紋理非常敏感,這部分也需要分配更多的碼率,而在脫焦區(qū)域,我們會(huì)適當(dāng)?shù)臏p少一些碼率。通過上述手段,整個(gè)視頻的碼率沒有上升,但人眼的主觀感覺會(huì)更清晰。
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
電子發(fā)燒友App













































評(píng)論