揭秘视频千倍压缩背后的技术原理之预测技术
正文字?jǐn)?shù):3312 ?閱讀時(shí)長:4分鐘
隨著5G的成熟和廣泛商用,帶寬已經(jīng)越來越高,傳輸視頻變得更加容易。設(shè)備特別是移動設(shè)備算力的提升、存儲容量的提升,使得視頻技術(shù)的應(yīng)用越來越廣泛,無論是流媒體、泛娛樂、實(shí)時(shí)通信,視頻都帶給了用戶更加豐富的體驗(yàn)。
文 /?拍樂云Pano
視頻相關(guān)的技術(shù),特別是視頻壓縮,因其專業(yè)性,深入開發(fā)的門檻較高。具體到視頻實(shí)時(shí)通信場景,視頻壓縮技術(shù)面臨更嚴(yán)峻的挑戰(zhàn),因?yàn)閷?shí)時(shí)通信場景下,對時(shí)延要求非常高,對設(shè)備適配的要求也非常高,對帶寬適應(yīng)的要求也非常高,開發(fā)一款滿足實(shí)時(shí)通信要求的編解碼器,難度也很高。之前的文章中,我們已經(jīng)在《深入淺出理解視頻編解碼技術(shù)》一文中簡要介紹了視頻編解碼基本框架,今天我們將深入剖析其中的預(yù)測模塊,便于大家更好地理解視頻編解碼技術(shù)。
01
顏色空間
開始進(jìn)入主題之前,先簡單看一下視頻是如何在計(jì)算機(jī)中進(jìn)行表達(dá)的。視頻是由一系列圖片按照時(shí)間順序排列而成,每一張圖片為一幀。每一幀可以理解為一個(gè)二維矩陣,矩陣的每個(gè)元素為一個(gè)像素。一個(gè)像素通常由三個(gè)顏色進(jìn)行表達(dá),例如用RGB顏色空間表示時(shí),每一個(gè)像素由三個(gè)顏色分量組成。每一個(gè)顏色分量用1個(gè)字節(jié)來表達(dá),其取值范圍就是0~255。編碼中常用的YUV格式與之類似,這里不作展開。
圖片 From Leandro Moreira
以1280x720@60fps的視頻序列為例,十秒鐘的視頻有1280*720*3*60*10 = 1.6GB,如此大量的數(shù)據(jù),無論是存儲還是傳輸,都面臨巨大的挑戰(zhàn)。視頻壓縮或者編碼的目的,也是為了保證視頻質(zhì)量的前提下,將視頻減小,以利于傳輸和存儲。同時(shí),為了能正確還原視頻,需要將其解碼。
從最早的H.261開始,視頻編解碼的框架都采用了這一結(jié)構(gòu),如圖所示。主要的模塊分為幀內(nèi)/幀間預(yù)測、(反)變換、(反)量化、熵編碼、環(huán)內(nèi)濾波。一幀視頻數(shù)據(jù),首先被分割成一系列的方塊,按照從左到右從上到下的方式,逐個(gè)進(jìn)行處理,最后得到碼流。
?02
幀內(nèi)預(yù)測
視頻數(shù)據(jù)被劃分成方塊之后,相鄰的方塊的像素,以及方塊內(nèi)的像素,顏色往往是逐漸變化的,他們之間有比較強(qiáng)的有相似性。這種相似性,就是空間冗余。既然存在冗余,就可以用更少的數(shù)據(jù)量來表達(dá)這樣的特征。比如,先傳輸?shù)谝粋€(gè)像素的值,再傳輸?shù)诙€(gè)像素相對于第一個(gè)像素的變化值,這個(gè)變化值往往取值范圍變小了許多,原來要8個(gè)bit來表達(dá)的像素值,可能只需要少于8個(gè)bit就足夠了。同樣的道理,以像素塊為基本單位,也可以進(jìn)行類似的“差分”操作。我們從示例圖中,來更加直觀地感受一下這樣的相似性。
如圖中所標(biāo)出的兩個(gè)8x8的塊,其亮度分量(Y)沿著“左上到右下”的方向,具有連續(xù)性,變化不大。假如我們設(shè)計(jì)某種特定的“模式”,使其利用左邊的塊來“預(yù)測”右邊的塊,那么“原始像素”減去“預(yù)測像素”就可以減少傳輸所需要的數(shù)據(jù)量,同時(shí)將該“模式”寫入最終的碼流,解碼器便可以利用左側(cè)的塊來“重建”右側(cè)的塊。極端一點(diǎn)講,假如左側(cè)的塊的像素值經(jīng)過一定的運(yùn)算可以完全和右側(cè)的塊相同,那么編碼器只要用一個(gè)“模式”的代價(jià),傳輸右側(cè)的塊。
當(dāng)然,視頻中的紋理多種多樣,單一的模式很難對所有的紋理都適用,因此標(biāo)準(zhǔn)中也設(shè)計(jì)了多種多樣的幀內(nèi)預(yù)測模式,以充分利用像素間的相關(guān)性,達(dá)到壓縮的目的。例如下圖所示的H.264中9種幀內(nèi)預(yù)測方向。以模式0(豎直預(yù)測)為例,上方塊的每個(gè)像素值(重建)各復(fù)制一列,得到幀內(nèi)預(yù)測值。其它各種模式也采用類似的方法,不過,生成預(yù)測值的方式稍有不同。
有這么多的模式,就產(chǎn)生了一個(gè)問題,對于一個(gè)塊而言,我們應(yīng)該采用哪種模式來進(jìn)行編碼呢?最佳的選擇方式,就是遍歷所有的模式進(jìn)行嘗試,計(jì)算其編碼的所需的比特?cái)?shù)和產(chǎn)生的質(zhì)量損失,即率失真優(yōu)化,這樣明顯非常復(fù)雜,因而也有很多種其它的方式來推斷哪種模式更好,例如基于SATD或者邊緣檢測等。
從H.264的9種預(yù)測模式,到AV1的56種幀內(nèi)方向預(yù)測模式,越來越多的模式也是為了更加精準(zhǔn)地預(yù)測未編碼的塊,但是模式的增加,一方面增加了傳輸模式的碼率開銷,另一方面,從如此重多的模式中選一個(gè)最優(yōu)的模式來編碼,使其能達(dá)到更高的壓縮比,這對編碼器的設(shè)計(jì)和實(shí)現(xiàn)也提出了更高的要求。?
圖片 From Vcodex
?03
幀間預(yù)測
以下5張圖片是一段視頻的前5幀,可以看出,圖片中只有Mario和磚塊在運(yùn)動,其余的場景大多是相似的,這種相似性就稱之為時(shí)間冗余。編碼的時(shí)候,我們先將第一幀圖片通過前文所述的幀內(nèi)預(yù)測方式進(jìn)行編碼傳輸,再將后續(xù)幀的Mario、磚塊的運(yùn)動方向進(jìn)行傳輸,解碼的時(shí)候,就可以將運(yùn)動信息和第一幀一起來合成后續(xù)的幀,這樣就大大減少了傳輸所需的bit數(shù)。這種利用時(shí)間冗余來進(jìn)行壓縮的技術(shù),就是運(yùn)動補(bǔ)償技術(shù)。該技術(shù)早在H.261標(biāo)準(zhǔn)中,就已經(jīng)被采用。
細(xì)心地讀者可能已經(jīng)發(fā)現(xiàn),Mario和磚塊這樣的物體怎么描述,才能讓它僅憑運(yùn)動信息就能完整地呈現(xiàn)出來?其實(shí)視頻編碼中并不需要知道運(yùn)動的物體的形狀,而是將整幀圖像劃分成像素塊,每個(gè)像素塊使用一個(gè)運(yùn)動信息。即基于塊的運(yùn)動補(bǔ)償。下圖中紅色圈出的白色箭頭即編碼磚塊和Mario時(shí)的運(yùn)動信息,它們都指向了前一幀中所在的位置。Mario和磚塊都有兩個(gè)箭頭,說明它們都被劃分在了兩個(gè)塊中,每一個(gè)塊都有單獨(dú)的運(yùn)動信息。這些運(yùn)動信息就是運(yùn)動矢量。運(yùn)動矢量有水平和豎直兩個(gè)分量,代表是的一個(gè)塊相對于其參考幀的位置變化。參考幀就是已經(jīng)編碼過的某一(多)個(gè)幀。
當(dāng)然,傳輸運(yùn)動矢量本身就要占用很多 bit,為了提高運(yùn)動矢量的傳輸效率,一方面,可以盡可能得將塊劃分變大,共用一個(gè)運(yùn)動矢量,因?yàn)槠教箙^(qū)域或者較大的物體,他們的運(yùn)動可能是比較一致的,從 H.264 開始,可變塊大小的運(yùn)動補(bǔ)償技術(shù)被廣泛采用;另一方面,相鄰的塊之間的運(yùn)動往往也有比較高的相似性,其運(yùn)動矢量也有較高的相似性,運(yùn)動矢量本身也可以根據(jù)相鄰的塊運(yùn)動矢量來進(jìn)行預(yù)測,即運(yùn)動矢量預(yù)測技術(shù);最后,運(yùn)動矢量在表達(dá)物體運(yùn)動的時(shí)候,有精度的取舍。
像素是離散化的表達(dá),現(xiàn)實(shí)中物體的運(yùn)動顯然不是以像素為單位進(jìn)行運(yùn)動的,為了精確地表達(dá)物體的運(yùn)動,需要選擇合適的精度來定義運(yùn)動矢量。各視頻編解碼標(biāo)準(zhǔn)都定義了運(yùn)動矢量的精度,運(yùn)動矢量精度越高,越能精確地表達(dá)運(yùn)動,但是代價(jià)就是傳輸運(yùn)動矢量需要花費(fèi)更多的bit。H.261中運(yùn)動矢量是以整像素為精度的,H.264中運(yùn)動矢量是以四分之一像素為精度的,AV1中還增加了八分之一精度。一般情況,時(shí)間上越近的幀,它們之間的相似性越高,也有例外,例如往復(fù)運(yùn)動的場景等,可能相隔幾幀,甚至更遠(yuǎn)的幀,會有更高的相似度。為了充分利用已經(jīng)編碼過的幀來提高運(yùn)動補(bǔ)償?shù)臏?zhǔn)確度,從H.264開始引入了多參考幀技術(shù),即,一個(gè)塊可以從已經(jīng)編碼過的很多個(gè)參考幀中進(jìn)行運(yùn)動匹配,將匹配的幀索引和運(yùn)動矢量信息都進(jìn)行傳輸。
那么如何得到一個(gè)塊的運(yùn)動信息呢?最樸素的想法就是,將一個(gè)塊,在其參考幀中,逐個(gè)位置進(jìn)行匹配檢查,匹配度最高的,就是最終的運(yùn)動矢量。匹配度,常用的有SAD(Sum of Absolute Difference)、SSD(Sum of Squared Difference)等。逐個(gè)位置進(jìn)行匹配度檢查,即常說的全搜索運(yùn)動估計(jì),其計(jì)算復(fù)雜度可想而知是非常高的。為了加快運(yùn)動估計(jì),我們可以減少搜索的位置數(shù),類似的有很多算法,常用的如鉆石搜索、六邊形搜索、非對稱十字型多層次六邊形格點(diǎn)搜索算法等。
以鉆石搜索為例,如圖所示,以起始的藍(lán)色點(diǎn)為中心的9個(gè)匹配位置,分別計(jì)算這9個(gè)位置的SAD,如果SAD最小的是中心位置,下一步搜索中心點(diǎn)更近的周圍4個(gè)綠色點(diǎn)的SAD,選擇其中SAD最小的位置,繼續(xù)縮小范圍進(jìn)行搜索;如果第一步中SAD最小的點(diǎn)不在中心,那么以該位置為中心,增加褐色的5或者3個(gè)點(diǎn),繼續(xù)計(jì)算SAD,如此迭代,直到找到最佳匹配位置。
編碼器在實(shí)現(xiàn)時(shí),可根據(jù)實(shí)際的應(yīng)用場景,對搜索算法進(jìn)行選擇。例如,在實(shí)時(shí)通信場景下,計(jì)算復(fù)雜度是相對有限的,運(yùn)動估計(jì)模塊要選擇計(jì)算量較小的算法,以平衡復(fù)雜度和編碼效率。當(dāng)然,運(yùn)動估計(jì)與運(yùn)動補(bǔ)償?shù)膹?fù)雜度還與塊的大小,參考幀的個(gè)數(shù),亞像素的計(jì)算等有關(guān),在此不再深入展開。
?
?04
總結(jié)
本文介紹的預(yù)測技術(shù),充分利用了視頻信號空間上和時(shí)間上的相關(guān)性,通過多種設(shè)計(jì)精巧的預(yù)測模式,達(dá)到了去除冗余的目的,這是視頻壓縮高達(dá)千倍比例的關(guān)鍵之一。縱觀視頻編解碼技術(shù)的發(fā)展歷史,預(yù)測模式越來越多,預(yù)測的精確度越來越高,帶來的壓縮比也越來越高。如何快速高效地使用這些預(yù)測模式,也必然成為設(shè)計(jì)實(shí)現(xiàn)的重中之重,成為H.265/H.266/AV1這些新標(biāo)準(zhǔn)發(fā)揮其高效壓縮性能的關(guān)鍵。
講師招募?LiveVideoStackCon 2021 北京站
LiveVideoStackCon 2021 北京站(9月3-4日)正在面向社會公開招募講師,歡迎通過?speaker@livevideostack.com?提交個(gè)人及議題資料,無論你的公司大小,title高低,老鳥還是菜鳥,只要你的內(nèi)容對技術(shù)人有幫助,其他都是次要的,我們將會在24小時(shí)內(nèi)給予反饋。點(diǎn)擊[閱讀原文]了解大會更多內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的揭秘视频千倍压缩背后的技术原理之预测技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GRTN赋能淘系内容业务的演进路线及未来
- 下一篇: 音视频技术开发周刊 | 199