音視頻二:H264宏塊劃分原理

在上一篇《音視頻一、音視頻本質(zhì)及ffmpeg安裝》中介紹了視頻文件格式,視頻封裝格式,音視頻編碼格式,以及利用ffmpeg驗(yàn)證音視頻主要由音頻和視頻組成。

本章主要是對(duì)音視頻一些基礎(chǔ)概念的理解。

塊結(jié)構(gòu)的混合編碼

第一種采用 “塊結(jié)構(gòu)的混合編碼” 方案的編碼標(biāo)準(zhǔn):音視頻鼻祖H261。

先看一個(gè)例子:假如一個(gè)漸變的圖片,按像素保存的方式和塊結(jié)構(gòu)保存的方式,兩種方式對(duì)比:

  • 按像素保存的方式:一張200*100的圖片,一共需要2萬(wàn)個(gè)像素保存,一個(gè)像素用RGBA保存,一共8萬(wàn)個(gè)字節(jié)。

  • 如果換一種方式:圖片寬,圖片高,起始點(diǎn)(寬、高),終止點(diǎn)(寬、高),起始點(diǎn)顏色(RGBA),終止點(diǎn)顏色(RGBA)。只需要14個(gè)字節(jié)就能保存這張圖片的所有信息,而且能完整還原。

這個(gè)例子中,在沒(méi)有損壞畫(huà)質(zhì)的前提下,圖片的壓縮效果非常好。

音視頻中某一幀的圖片,肯定不會(huì)那么巧,剛好整張圖片漸變,但科學(xué)家利用這個(gè)特點(diǎn),應(yīng)用到音頻領(lǐng)域編碼算法上,以下面這張圖片為例:


示例圖片.png
放大很多倍后再觀(guān)察.png

科學(xué)家對(duì)圖片放大很多倍后的微觀(guān)層面分析,在圖片的一些部分,可以采用漸變處理方法來(lái)達(dá)到壓縮數(shù)據(jù)的目的,而一些像素差異很大的地方,按他原本的數(shù)據(jù)進(jìn)行處理。這樣來(lái)達(dá)到畫(huà)質(zhì)在人眼中分辨不出來(lái)的效果。人眼對(duì)微觀(guān)分辨沒(méi)有那么敏感,所以這種處理后,人眼基本感覺(jué)不出來(lái)。即使放到微觀(guān)層面,小塊并不都是絕對(duì)的漸變,但是不影響效果,當(dāng)然這種編碼算法是有損的,權(quán)衡利弊之后值得采用。

拓展知識(shí)點(diǎn):實(shí)際上存在無(wú)損編碼格式的應(yīng)用,電影院采用的jpeg2000,它是一種通過(guò)存儲(chǔ)原圖片的方式進(jìn)行視頻播放,因?yàn)樗糯蟮骄扌推聊簧希绻捎脡嚎s編碼,還原之后就會(huì)出現(xiàn)上圖中的情況,為了觀(guān)影體驗(yàn),所以沒(méi)法壓縮,當(dāng)然這不在我們考慮的范圍內(nèi)。

H264壓縮技術(shù)

了解了塊結(jié)構(gòu)混合編碼后,理解H264的基本原理其實(shí)非常簡(jiǎn)單,下我們就簡(jiǎn)單的描述一下H264壓縮數(shù)據(jù)的過(guò)程。通過(guò)攝像頭采集到的視頻幀(按每秒 30 幀算),被送到 H264 編碼器的緩沖區(qū)中。編碼器先要為每一幅圖片劃分宏塊。

以下面這張圖為例:


示例圖片

劃分宏塊

H264默認(rèn)是使用 16X16 大小的區(qū)域作為一個(gè)宏塊,也可以劃分成 8X8 大小。


整張圖片都是由這樣的宏塊組成

劃分好宏塊后,計(jì)算宏塊的象素值。

像素計(jì)算

以此類(lèi)推,計(jì)算一幅圖像中每個(gè)宏塊的像素值,所有宏塊都處理完后如下面的樣子。

最終一幀圖像由很多個(gè)宏塊表示

劃分子塊

H264對(duì)比較平坦的圖像使用 16X16 大小的宏塊。但為了更高的壓縮率,還可以在 16X16 的宏塊上更劃分出更小的子塊。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4非常的靈活。

子塊劃分示例

上幅圖中,紅框內(nèi)的 16X16 宏塊中大部分是藍(lán)色背景,而三只鷹的部分圖像被劃在了該宏塊內(nèi),為了更好的處理三只鷹的部分圖像,H264就在 16X16 的宏塊內(nèi)又劃分出了多個(gè)子塊。

16x16宏塊中又劃分子塊

這樣再經(jīng)過(guò)幀內(nèi)壓縮,可以得到更高效的數(shù)據(jù)。下圖是分別使用mpeg-2和H264對(duì)上面宏塊進(jìn)行壓縮后的結(jié)果。其中左半部分為MPEG-2子塊劃分后壓縮的結(jié)果,右半部分為H264的子塊劃壓縮后的結(jié)果,可以看出H264的劃分方法更具優(yōu)勢(shì)。

經(jīng)過(guò)H264處理的幀數(shù)據(jù)大大減少

宏塊劃分好后,就可以對(duì)H264編碼器緩存中的所有圖片進(jìn)行分組了。

宏塊的劃分規(guī)則

來(lái)源于《H.264視頻編碼官方中文幫助文檔》第6.3節(jié) 圖像和條帶的空間分割

一幅圖像如何分割為條帶和宏塊。圖像被劃分為條帶。條帶由一系列的宏塊組成,當(dāng)使用宏塊自 適應(yīng)幀/場(chǎng)解碼時(shí)則由一系列宏塊對(duì)組成。

每個(gè)宏塊均包含一個(gè) 16×16 的亮度陣列,當(dāng)視頻格式不是單色時(shí),還包含和兩個(gè)相應(yīng)的色度陣列。如果沒(méi) 有使用宏塊自適應(yīng)幀/場(chǎng)解碼,每個(gè)宏塊代表圖像中的一個(gè)空間矩形區(qū)域。例如,如圖 6-7 所示,一幅圖像被分為 兩個(gè)條帶。

宏塊條帶劃分.png

6.4節(jié) 反向掃描過(guò)程和相鄰數(shù)據(jù)的推導(dǎo)過(guò)程

規(guī)定反向掃描過(guò)程,例如索引值到位置的映射,以及相鄰數(shù)據(jù)的導(dǎo)出過(guò)程。

6.4.1 反向宏塊掃描過(guò)程
這里我們需要知道的是編碼算法會(huì)將每幀圖片每個(gè)宏塊都進(jìn)行掃描。進(jìn)行計(jì)算后,得到最優(yōu)的劃分結(jié)果。

6.4.2 反向宏塊分割和子宏塊分割的掃描過(guò)程


宏塊的分割與掃描.png

如果一個(gè)16x16的宏塊,數(shù)據(jù)波動(dòng)比較大,那我們就接著對(duì)宏塊進(jìn)行劃分,知道劃分成4x4為止。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容