被压缩的视觉:视频编解码技术
?
視覺(jué)是人類(lèi)獲得信息的主要方式,每天有大量的視頻信息被生產(chǎn)并傳輸。未經(jīng)壓縮的視頻內(nèi)容占用的存儲(chǔ)空間和傳輸帶寬十分巨大,以常見(jiàn)的30fps高清視頻為例,采用avi格式存儲(chǔ)的YUV420視頻流一分鐘就有2GB大小,傳輸帶寬需要40MB/s。所以我們?nèi)粘氖謾C(jī)和電腦等電子設(shè)備上獲得的視頻信息都是被壓縮后再傳輸和存儲(chǔ)的,壓縮這些視頻信息的技術(shù)便稱(chēng)為視頻編解碼技術(shù)。
文|何鳴 網(wǎng)易云信音視頻算法工程師
?
顏色空間
我們?nèi)搜鄣囊曈X(jué)信息是由視桿細(xì)胞和視錐細(xì)胞獲得的。視桿細(xì)胞主要感受光線(xiàn)的明暗變化,獲取視覺(jué)的亮度信息,而視錐細(xì)胞可以感受到顏色。根據(jù)仿生的原理,計(jì)算機(jī)采集視頻信號(hào)也采用亮度信息和速度信息分別采集的方式。由于人眼的視桿細(xì)胞數(shù)量比視錐細(xì)胞的數(shù)量多很多,所以人眼對(duì)于亮度信息更加敏感,所以在采集視頻信息時(shí),常采用YUV420的格式采集。具體操作如圖1中所示,四個(gè)亮度像素Y共用一組紅色和藍(lán)色的色度像素。
圖1 YUV420顏色空間
采集來(lái)的像素在計(jì)算機(jī)內(nèi)部都采用2進(jìn)制的形式存儲(chǔ),為了表示人眼視覺(jué)的顏色空間,在計(jì)算機(jī)內(nèi)部一般采用256色存儲(chǔ),即亮度信息和色度信息的取值范圍都是0到255。通過(guò)不同的數(shù)值組合可以表示出不同的顏色,例如,YUV都是255時(shí)是粉色,YUV都是0時(shí)是深綠色。這樣為了表示一個(gè)像素需要1.5字節(jié)的數(shù)據(jù),而一幅圖像中有成千上萬(wàn)個(gè)像素。一幅720p分辨率的視頻包含92萬(wàn)個(gè)像素,一幅1080p分辨率的視頻包含207萬(wàn)個(gè)像素,而一秒鐘的視頻包含30幀圖像。對(duì)于數(shù)據(jù)量巨大的YUV視頻數(shù)據(jù),需要壓縮后才能存儲(chǔ)與傳輸。
?
壓縮原理
壓縮視頻信息與壓縮文件信息不同,在視頻中存在著大量的冗余信息。如圖2所示,相鄰幀之間的相似性會(huì)有時(shí)間上的冗余,同一幀的相鄰塊之間存在著空間上的冗余,由于人眼感知對(duì)于低頻信息更敏感,所以存在著感知上的冗余。
圖2 視頻中的冗余信息
視頻壓縮的基本原理就是去除這些冗余信息,將視頻壓縮300到500倍,常見(jiàn)的壓縮方法有預(yù)測(cè)編碼、變換編碼和熵編碼技術(shù)。如圖3所示,將輸入的視頻信息按照各個(gè)編碼模塊進(jìn)行處理,輸出碼流的過(guò)程稱(chēng)為視頻編碼過(guò)程,再通過(guò)對(duì)應(yīng)的熵解碼、變換解碼和預(yù)測(cè)解碼過(guò)程,將碼流還原成YUV420視頻流的過(guò)程稱(chēng)為視頻解碼過(guò)程。可以將視頻編解碼的過(guò)程看作是壓縮和解壓縮的過(guò)程,但在該過(guò)程中,由于壓縮的算法有所差異,所以解碼的算法必須對(duì)應(yīng)著編碼的算法,不同的編解碼算法稱(chēng)為視頻標(biāo)準(zhǔn)。
圖3 視頻編碼技術(shù)
現(xiàn)在常用的視頻標(biāo)準(zhǔn),例如H.26x系列標(biāo)準(zhǔn),其中最常用的是H.264標(biāo)準(zhǔn),由于開(kāi)源編碼器x264的普及,也將這代標(biāo)準(zhǔn)稱(chēng)為x264標(biāo)準(zhǔn)。H.26x系列標(biāo)準(zhǔn)的研發(fā)與進(jìn)展一直是行業(yè)的標(biāo)桿,最新的H.266/VVC標(biāo)準(zhǔn)加入許多新技術(shù),而這些技術(shù)可以簡(jiǎn)單概括為以下幾個(gè)方面:
塊劃分技術(shù):除深度學(xué)習(xí)技術(shù)外,傳統(tǒng)的視頻編解碼技術(shù)都是按塊去處理視頻,而且趨勢(shì)是最大塊越來(lái)越大,最小塊越來(lái)越小,塊的類(lèi)型越來(lái)越多。對(duì)于相對(duì)靜止的區(qū)域,采用大塊可以提高壓縮效率,使用一兩個(gè)標(biāo)志位或者很少的殘差數(shù)據(jù)就可以表示一個(gè)大塊,可以極大的壓縮視頻畫(huà)面。對(duì)于運(yùn)動(dòng)比較多的區(qū)域,采用小塊可以提高畫(huà)質(zhì)質(zhì)量,將運(yùn)動(dòng)的細(xì)節(jié)更完整的表示出來(lái)。為了更精細(xì)的劃分運(yùn)動(dòng)和靜止的區(qū)域,塊劃分技術(shù)采用各種形狀的矩形塊代替原有的方形塊劃分。在工程落地方面,越來(lái)越復(fù)雜的塊劃分技術(shù)浪費(fèi)大量的計(jì)算資源,所以很多快速算法都是針對(duì)塊劃分模式進(jìn)行預(yù)測(cè),將機(jī)器學(xué)習(xí)算法和深度學(xué)習(xí)算法應(yīng)用到塊劃分預(yù)測(cè)過(guò)程中,可以在質(zhì)量損失微乎其微的情況下,快速得出塊劃分模式。
圖4 H.265的塊劃分示意圖
幀內(nèi)預(yù)測(cè):幀內(nèi)預(yù)測(cè)屬于預(yù)測(cè)編碼的范疇,在視頻序列中,有一些幀和塊的預(yù)測(cè)信息無(wú)法從參考幀中獲得,這樣的幀被稱(chēng)為I幀或幀內(nèi)預(yù)測(cè)塊。在I幀中所有的塊都是幀內(nèi)預(yù)測(cè)塊,而幀內(nèi)預(yù)測(cè)塊可以存在于I幀或P幀和B幀中。具體怎么實(shí)現(xiàn)幀內(nèi)預(yù)測(cè)呢,對(duì)于一個(gè)幀內(nèi)預(yù)測(cè)塊,首先在該塊周?chē)a(bǔ)償出一圈像素(對(duì)于邊緣部分,可以采用擴(kuò)邊的方式),根據(jù)這圈像素值,采用角度預(yù)測(cè)或者平面預(yù)測(cè)的方式補(bǔ)償出當(dāng)前塊,再通過(guò)與原圖比較,選擇損失最小的預(yù)測(cè)模式。由于幀內(nèi)預(yù)測(cè)補(bǔ)償時(shí)采用的像素值都來(lái)自于當(dāng)前幀,不需要參考幀信息,所以幀內(nèi)預(yù)測(cè)常用于序列首幀或者視頻信息變化比較大的區(qū)域。
圖5 幀內(nèi)預(yù)測(cè)示意圖
幀間預(yù)測(cè):與幀內(nèi)預(yù)測(cè)相對(duì)應(yīng)的是幀間預(yù)測(cè)技術(shù),他們同屬于預(yù)測(cè)編碼技術(shù)。幀間預(yù)測(cè)的參考圖像信息來(lái)自于參考幀,所以在視頻首幀或者參考幀缺失的情況下不能使用幀間預(yù)測(cè)技術(shù)。幀間預(yù)測(cè)的關(guān)鍵過(guò)程便是運(yùn)動(dòng)搜索與運(yùn)動(dòng)補(bǔ)償過(guò)程。運(yùn)動(dòng)搜索過(guò)程負(fù)責(zé)搜索出參考幀上最接近當(dāng)前塊的圖像塊,并生成運(yùn)動(dòng)矢量,運(yùn)動(dòng)補(bǔ)償則根據(jù)參考幀信息生成當(dāng)前幀信息。根據(jù)最新的幀間預(yù)測(cè)技術(shù),運(yùn)動(dòng)信息可以包含平移、縮放和旋轉(zhuǎn)。由于運(yùn)動(dòng)矢量指向的位置未必是整數(shù)像素的位置,所以在運(yùn)動(dòng)補(bǔ)償過(guò)程中還涉及到亞像素補(bǔ)償技術(shù)。通過(guò)幀間預(yù)測(cè)可以極大提高視頻的壓縮率,例如在參考幀中有著相似度很高的塊,則可以對(duì)當(dāng)前塊采用skip的模式編碼,僅需一個(gè)標(biāo)志位即可編碼原有塊內(nèi)所有的YUV信息。
圖6 幀間預(yù)測(cè)示意圖
變換量化:變換與量化技術(shù)是配套使用的,在剛剛的分析中,由于人眼對(duì)于高頻信息的不敏感,需要對(duì)高頻信息進(jìn)行壓縮,在頻域更容易對(duì)其進(jìn)行操作,所以需要對(duì)圖像進(jìn)行變換。常用的變換方式有哈達(dá)瑪、整數(shù)DCT和整數(shù)DST,由于有預(yù)測(cè)編碼技術(shù)的存在,所以變換通常在殘差信息上操作,根據(jù)不同的壓縮率要求,可以對(duì)變換后的系數(shù)進(jìn)行量化,僅保留人眼更敏感的低頻信息。在解碼過(guò)程中,需要配套的反量化和反變換技術(shù),將壓縮后的殘差系數(shù)還原出來(lái)。
圖7 16x16DCT變換核
熵編碼:對(duì)于標(biāo)志位和殘差系數(shù),還需要一套編碼技術(shù)進(jìn)一步壓縮這些信息,對(duì)于一些關(guān)鍵信息,可以采用指數(shù)哥倫布,游程編碼等方式壓縮,對(duì)于大量的殘差系數(shù)和圖像幀內(nèi)的編碼信息,現(xiàn)在常用基于上下文模型的熵編碼技術(shù)進(jìn)行壓縮。熵編碼的基本原理是對(duì)小概率符號(hào)使用更多比特編碼,而大概率符號(hào)則采用較少的比特編碼,通過(guò)上下文模型,大部分的大概率符號(hào)都可以被壓縮。區(qū)別于預(yù)測(cè)編碼和變換量化過(guò)程,熵編碼過(guò)程是無(wú)損的。
圖8 CABAC編碼器框架
環(huán)路濾波:對(duì)于參考幀來(lái)說(shuō),由于后續(xù)的視頻都是依據(jù)前面視頻幀的信息補(bǔ)償出來(lái),所以參考幀中出現(xiàn)的損失和錯(cuò)誤,會(huì)延續(xù)到整個(gè)序列,隨著運(yùn)動(dòng)補(bǔ)償?shù)倪^(guò)程,或擴(kuò)散到整個(gè)視頻幀當(dāng)中。為了降低視頻的損失,在每一幀編碼完之后,都會(huì)對(duì)其進(jìn)行后處理,處理這些視頻幀的濾波器被稱(chēng)為環(huán)路濾波器,使其更加接近于原始視頻序列。現(xiàn)階段,許多基于深度學(xué)習(xí)的后處理技術(shù)被應(yīng)用到環(huán)路濾波器當(dāng)中,在編解碼過(guò)程中起到很好的效果。
圖9 環(huán)路濾波器SAO的4種邊界補(bǔ)償模式
除了以上技術(shù),在工程化落地過(guò)程中,碼控技術(shù)、并行技術(shù)、指令集技術(shù)同樣影響編碼器效果。視頻編解碼技術(shù)包含著一系列算法的技術(shù)集成,將這些技術(shù)組合使用,形成各類(lèi)視頻編解碼標(biāo)準(zhǔn)。除H.26x視頻標(biāo)準(zhǔn)之外,還存在著開(kāi)放視頻標(biāo)準(zhǔn)聯(lián)盟的AV1標(biāo)準(zhǔn),國(guó)產(chǎn)的AVS標(biāo)準(zhǔn)等。
圖10 WPP并行技術(shù)示意圖
?
?
視頻編碼技術(shù)的挑戰(zhàn)與發(fā)展
根據(jù)現(xiàn)在的技術(shù)需求,未來(lái)的視頻編碼技術(shù)需要面對(duì)更高分辨率、更高幀率、更廣色域及HDR視頻的挑戰(zhàn)。同時(shí),面對(duì)更多形式的視頻內(nèi)容,例如全景視頻、點(diǎn)云、深度學(xué)習(xí)特征圖等,視頻編碼技術(shù)需要與時(shí)俱進(jìn),不斷發(fā)展。現(xiàn)有技術(shù)方興未艾,未來(lái)技術(shù)仍然可期。
?
?
直播預(yù)告
視頻編解碼技術(shù)一直是視頻內(nèi)容應(yīng)用中的核心業(yè)務(wù),基于各個(gè)平臺(tái)和各個(gè)渠道的視頻內(nèi)容采集與分發(fā)都涉及到視頻編解碼技術(shù)的介入。在RTC業(yè)務(wù)場(chǎng)景下,如何構(gòu)建高效快速的視頻編解碼引擎,如何對(duì)現(xiàn)有的編解碼技術(shù)進(jìn)行優(yōu)化改進(jìn),如何在公有協(xié)議基礎(chǔ)上實(shí)現(xiàn)私有協(xié)議,如何重寫(xiě)編解碼框架等問(wèn)題都值得關(guān)注。
1月14日19:30,網(wǎng)易云信音視頻算法工程師何鳴將為大家詳細(xì)介紹網(wǎng)易云信RTC業(yè)務(wù)場(chǎng)景下的編解碼技術(shù)優(yōu)化與實(shí)踐,以及未來(lái)的發(fā)展方向。
總結(jié)
以上是生活随笔為你收集整理的被压缩的视觉:视频编解码技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网易云信荣获第十五届中国企业年终评选「I
- 下一篇: 基于 WebRTC 实现自定义编码分辨率