H264基本概念
視頻的本質(zhì)就是很多幀圖片,在視頻采集過程中其實就是圖片采集笛臣,而h264編碼就是對這些圖片進行壓縮葵袭,以便于存儲和傳輸廉白。針對一幀幀的圖片个初,引申出以下的概念:
· I幀:關(guān)鍵幀,采用幀內(nèi)壓縮技術(shù)
舉個例子,如果你用攝像頭對著一棵樹來拍攝蒙秒,1秒之內(nèi),實際你發(fā)生的變化是非常少的勃黍。1秒鐘之內(nèi)實際很少有大幅度的變化.攝像機一般一秒鐘會抓取幾十幀的數(shù)據(jù)。動畫一般都是15幀/s晕讲,平時我們的視頻文件一般也就是30幀/s覆获,對于一些要求比較高的,對動作的精細度有要求瓢省,想要捕捉到完整的動作的,高級的攝像機一般是60幀/s弄息。I幀一般都是一組幀的第一幀,I幀需要完整的保存下來勤婚,如果沒有這個關(guān)鍵幀后面解碼數(shù)據(jù),是完成不了的.所以I幀特別關(guān)鍵.摹量。
· P幀:向前參考幀.壓縮時只參考前一個幀.屬于幀間壓縮技術(shù)
視頻的第一幀會被作為關(guān)鍵幀完整保存下來.而后面的幀會向前依賴.也就是第二幀依賴于第一個幀.后面所有的幀只存儲于前一幀的差異.這樣就能將數(shù)據(jù)大大的減少.從而達到一個高壓縮率的效果.
· B幀:雙向參考幀,壓縮時即參考前一幀也參考后一幀.幀間壓縮技術(shù).
B幀,即參考前一幀,也參考后一幀.這樣就使得它的壓縮率更高.存儲的數(shù)據(jù)量更小.如果B幀的數(shù)量越多,你的壓縮率就越高.這是B幀的優(yōu)點,但是B幀最大的缺點是,如果是實時互動的直播,那時與B幀就要參考后面的幀才能解碼,那在網(wǎng)絡(luò)中就要等待后面的幀傳輸過來.這就與網(wǎng)絡(luò)有關(guān)了.如果網(wǎng)絡(luò)狀態(tài)很好的話,解碼會比較快,如果網(wǎng)絡(luò)不好時解碼會稍微慢一些.丟包時還需要重傳.對實時互動的直播,一般不會使用B幀。(如果我們對實時性的要求不高的話,就可以使用B幀缨称,單對于一些實時性要求比較高的直播來說凝果,B幀可以完全不用的)。
GOF(Group of Frame)一組幀
如果在一秒鐘內(nèi),有30幀.這30幀可以畫成一組.如果攝像機或者鏡頭它一分鐘之內(nèi)它都沒有發(fā)生大的變化.那也可以把這一分鐘內(nèi)所有的幀畫做一組.
一組幀:
一個I幀到下一個I幀.這一組的數(shù)據(jù).包括B幀/P幀.我們稱為GOF(如下圖)
補充:
簡單分析一下我們在平時看視頻時候會發(fā)現(xiàn)花屏或者卡頓的現(xiàn)象睦尽,主要是一組幀(GOF)里面的P幀缺失或者受損讓解碼時候發(fā)生錯誤導(dǎo)致的器净。為了避免花屏的發(fā)生,一般會不顯示發(fā)生P幀或者I幀丟失的那一組幀当凡,等到下一個I幀到來時才顯示下一組幀山害,然而這樣子治標不治本,長時間顯示上一組幀沿量,會導(dǎo)致卡頓現(xiàn)象的發(fā)生浪慌。
幀內(nèi)預(yù)測壓縮
幀內(nèi)預(yù)測壓縮,解決的是空域數(shù)據(jù)冗余問題,一幅圖里數(shù)據(jù)在寬高空間內(nèi)包含了很多顏色,光亮.人的肉眼很難察覺的數(shù)據(jù). 對于這些數(shù)據(jù),我們可以認作冗余.直接壓縮掉的朴则。
幀間預(yù)測壓縮
解決的是時域數(shù)據(jù)冗余問題权纤,攝像頭在一段時間內(nèi)所捕捉的數(shù)據(jù)沒有較大的變化,我們針對這一時間內(nèi)的相同的數(shù)據(jù)壓縮掉.這叫時域數(shù)據(jù)壓縮。
(除以上之外還有CABAC無損壓縮與整數(shù)離散余弦變換(DCT)
在分析幀內(nèi)預(yù)測與幀間預(yù)測之前我們還需知道宏塊劃分與分組
H264宏塊劃分:
將一個圖片左上角用宏塊描述,就是宏塊是8*8的元素.取出的顏色,像右邊的去描述.描述顏色.將一個圖片全部用宏塊描述就如下圖佛掖。
基本上宏塊劃分就完成了妖碉,那么宏塊還可以在細分嗎?當然是可以的芥被,宏塊可以進行子塊的劃分,如下圖:
在這個大的宏塊里,可以再細化. 我們可以看到在這個大的宏塊里,我們更加細化了. 比如我們中間這個全部都是藍色的這個宏塊,就可以用一個色塊,更加簡單描述就行了坐榆。
由上圖可以看出拴魄,MPEG2和H.264.就會發(fā)現(xiàn)MPEG2存儲時還算比較完整.占用的空間相對于比較多.而H.264還是減少了很多空間.像重復(fù)的顏色他們就用非常簡單的色塊描述了。
幀間預(yù)測壓縮分析
現(xiàn)在我們有一組幀(如下圖)席镀,記錄的是桌球在桌球臺上的運動匹中,好明顯這一組幀的背景就是桌球臺,這是不變的豪诲,改變的就是桌球的位置顶捷,這就是幀分組。
然后進行組內(nèi)宏塊的查找(如下圖)屎篱,臺球從一角滾到另外一角.相鄰的2幅圖做組內(nèi)的宏塊查找服赎。將圖逐行掃描,掃描到第三行.發(fā)現(xiàn)了臺球. 然后圍繞它的周圍查找.發(fā)現(xiàn)了有類似的圖塊。
以上操作找到了對應(yīng)的宏塊交播,然后就會進行運動估算重虑。然后把他們放在同一張圖上面(如下圖),而在兩個位置之間就會存在著一個運動矢量秦士。矢量會包含運動的方向和距離缺厉。以此類推,我們將所有的圖進行兩兩比較的話,就會得出第一張圖+很多幀的運動矢量提针,數(shù)據(jù)就達到了很大的減少命爬。
你以為這樣子就結(jié)束了嘛?其不然辐脖!雖然說每張圖的背景都一樣的饲宛,其實還是存在著一些差別的。好明顯就是臺球的數(shù)據(jù)揖曾,有些我們?nèi)庋劭床磺宓臄?shù)據(jù)落萎,例如光線的影響。所以幀間預(yù)測過程中還會對每幀圖進行殘差數(shù)據(jù)的計算炭剪,實際經(jīng)過我們一運算后.它留下的就只是運動矢量數(shù)據(jù)+殘差值的數(shù)據(jù)练链。經(jīng)過這樣的一個計算.幀間壓縮數(shù)據(jù)我們就可以看到實際我們只需要存儲一點點數(shù)據(jù).而不像以前要將幾十幀的所有圖片數(shù)據(jù)保存下來.這就達到了壓縮的效果奴拦,這個過程就叫做幀間壓縮技術(shù)的原理媒鼓。
幀內(nèi)預(yù)測壓縮分析
幀內(nèi)預(yù)測壓縮在平時開發(fā)中使用較多,幀內(nèi)壓縮是針對于I幀的错妖。因為它解決的是空間的數(shù)據(jù)冗余绿鸣,而幀間壓縮是解決的時間數(shù)據(jù)冗余。我們剛剛說明的是幀間壓縮技術(shù)暂氯,將大量在時間軌跡上相同的數(shù)據(jù)壓縮掉潮模,只留下運算估量和殘差值。
而幀內(nèi)壓縮用到了完全不同的技術(shù)手段痴施,我們首先計算出每個宏塊的宏塊模式擎厢,一共9種。如圖所示:
參考文獻:
經(jīng)過計算最后得到的數(shù)據(jù)是每個宏塊預(yù)測得出宏塊的模式數(shù)據(jù)辣吃,如圖所示:
在每個宏塊模式確定之后呢动遭,就可以形成一張“預(yù)測圖”,左邊是預(yù)測圖,右邊是源圖神得。
得到的“預(yù)測圖”與原圖比較起來還是顯得比較粗糙的厘惦,然后兩者進行殘差數(shù)據(jù)的計算,得到殘差值哩簿。如圖:
低下的就是源于宵蕉,灰色圖就是殘差值。
預(yù)測模式與殘差值壓縮:
拿到殘差值之后,我們就進行壓縮. 壓縮時保存,殘差數(shù)據(jù)和每個宏塊選擇的模式信息數(shù)據(jù). 那么有了這2個數(shù)據(jù)之后.當我們解碼時,首先通過宏塊的模式信息計算出預(yù)測圖.然后將預(yù)測圖與我們的殘差值進行累積.就能還原成原圖像. 那這個過程就是"幀內(nèi)壓縮技術(shù)"的原理過程卡骂。
文章圖片來源于網(wǎng)絡(luò),如未能核實來源或轉(zhuǎn)發(fā)內(nèi)容圖片有瑕疵,請及時私信本人進行修改或者刪除国裳。