版權(quán)聲明:本文為衛(wèi)偉學習總結(jié)文章,轉(zhuǎn)載請注明出處!
1.H264基礎(chǔ)概念
在H.264/AVC視頻編碼標準中,整個系統(tǒng)框架劃分如下兩個層面:
- 視頻編碼層(VCL): VCL數(shù)據(jù)即被壓縮編碼后的視頻數(shù)據(jù)序列,負責有效表示視頻數(shù)據(jù)的內(nèi)容;
- 網(wǎng)絡(luò)抽象層(NAL):負責將VCL數(shù)據(jù)封裝到NAL單元中,并提供頭信息,以保證數(shù)據(jù)適合各種信道和存儲介質(zhì)上的傳輸。

每個 NAL 單元都是由 1 字節(jié) NAL header 和 若干整數(shù)字節(jié)的負荷數(shù)據(jù) EBSP 構(gòu)成。
2. I幀、B幀和 P幀
視頻壓縮中,每一幀代表一副靜止的圖像。而在實際壓縮時,會采取各種算法減少數(shù)據(jù)的容量,其中IPB就是最常見的。
簡單地說,I幀就是關(guān)鍵幀??梢岳斫鉃閹瑑?nèi)壓縮。P是向前搜索的意思。B是雙向搜索。他們都是基于I幀來壓縮數(shù)據(jù)。
- I幀:表示關(guān)鍵幀,可以理解為這一幀畫面的完整保留,解碼時只需要本幀數(shù)據(jù)就可以完成(因為包含完整畫面)。
- P幀:表示的是這一幀跟之前的一個關(guān)鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù))。
- B幀:是雙向差別的幀,也就是 B幀 記錄的是本幀與前后幀的差別(具體比較復(fù)雜,有四種情況)。換言之,要解碼 B幀,不僅要取得之前的緩存畫面,還要本幀之后的畫面,通過前后畫面與本幀數(shù)據(jù)的疊加取得最終的畫面。B幀 壓縮率高,但是解碼時 CPU 會比較累。
采用的壓縮方法:分組,將幾幀圖像分為一組(GOP),為防止運動變化,幀數(shù)不宜取多。
- 定義幀:將每組內(nèi)各幀圖像定義為三種類型,即 I幀,P幀,B幀;
- 預(yù)測幀:以 I幀 為基礎(chǔ)幀,以 I幀 預(yù)測 P幀,再由 I幀 和 P幀 預(yù)測 B幀;
- 3 數(shù)據(jù)傳輸:最后將I幀數(shù)據(jù)與預(yù)測的差值信息進行存儲和傳輸。
3. GOF
GOF:一組幀。如果一秒鐘之內(nèi)有三十幀,這三十幀可以劃為一組。如果攝像頭一分鐘內(nèi)捕獲的圖片都沒有什么大變化,這樣也可把這一分鐘內(nèi)的所有幀成為一組幀。

3.1 SPS與PPS
SPS與PPS實際是對存GOF的參數(shù)。
SPS:Sequence Parameter Set, 序列參數(shù)數(shù)集,存放幀數(shù)、參考幀數(shù)目、解碼圖像尺寸、幀場編碼模式選擇標識等。
PPS:Picture Parameter Set,圖像參數(shù)集,存放熵編碼模式選擇標識、片組數(shù)目、初始量化參數(shù)和去方塊濾波系數(shù)調(diào)整標識等。
在一組幀之前,首先會收到SPS和PPS,如果沒有這兩個參數(shù)就不能進行解碼和編碼處理。SPS和PPS規(guī)劃為I幀,這兩個幀數(shù)據(jù)是不能丟失的。
4. 視頻花屏/卡頓原因
如果GOF分組中的P幀丟失會造成解碼端的圖像發(fā)生錯誤。本身一組幀形成圖像的連貫動作,當某一個幀沒有到達或者損失了,這時更新的那一塊數(shù)據(jù)就沒有。后面幀更新了,但前面那一塊沒有更新,就出現(xiàn)了花屏現(xiàn)象。
為了避免花屏問題的發(fā)生,一般如果發(fā)現(xiàn)P幀或者I幀丟失,就不顯示本GOP內(nèi)的所有幀,直到下一個I幀來后重新刷新圖像。這時會出現(xiàn)卡頓現(xiàn)象。
總結(jié)花屏是因為丟失了數(shù)據(jù),卡頓是為了防止花屏主動丟掉一組GOF數(shù)據(jù)。
5.視頻編碼器
x264/x265:x264是目前最廣泛的H.264的視頻編碼器。軟編基本用x264。x265也逐漸成熟。因為它的壓縮比更高,占用CPU的性能也高,在直播系統(tǒng)里不適合用。在點播系統(tǒng)里可以嘗試使用。
openH264:比x264性能更低些,但支持SVC視頻技術(shù)。SVC將視頻進行分層傳輸,一幀數(shù)據(jù)分為小中大三個部分。如果網(wǎng)絡(luò)差的情況下,只發(fā)最小內(nèi)核的幀,網(wǎng)絡(luò)稍微好點,發(fā)中間內(nèi)核幀。網(wǎng)絡(luò)非常好,全部發(fā)出去。發(fā)出去后,將這三層疊加在一起,恢復(fù)原來的視頻。
6.宏塊的劃分與幀分組



幀分組:一組幀內(nèi),一個物體運動是變化很小的。比如臺球的運動軌跡,可以將它的軌跡運動的幀劃分為一組。因為它們的變化特別小,整個背景都是綠色,只有臺球是白色??梢酝ㄟ^算法推算出臺球在某一幀它應(yīng)該會滾動到哪一個位置。

7.H264壓縮技術(shù)
幀內(nèi)預(yù)測壓縮:解決的是空域數(shù)據(jù)冗余問題??沼驍?shù)據(jù)就是一幅圖中其中顏色、色彩和光亮等人眼不是很敏感的部分,這部分稱之為冗余數(shù)據(jù),可以將它直接刪除掉的。
幀間預(yù)測壓縮:解決的是時域數(shù)據(jù)冗余問題。因為一組幀的數(shù)據(jù)相關(guān)型非常高,這些幀數(shù)據(jù)基本重復(fù)的,把這些重復(fù)的數(shù)據(jù)全部刪除。
整數(shù)離散余弦變換(DCT):將空間上的相關(guān)性變?yōu)轭l域上無關(guān)的數(shù)據(jù)然后進行量化。
CABAC壓縮:無損壓縮。
7.1.組內(nèi)宏塊查找 (幀間壓縮技術(shù))
一組運動臺球的幀,從一個角滾動到另一個角。將這一組幀的相鄰的兩幀做為組內(nèi)的宏塊查找。當掃描到一個臺球時,發(fā)現(xiàn)臺球之后就會在臺球周圍去找,周圍是否有類似的宏塊。它們之間有一個運動的方向和一個運動的距離,這就是運動矢量。將所有的這些幀都進行兩兩比較,最好就形成了右邊這張圖。每一個紅色的標注就是運動矢量。

7.2 幀內(nèi)預(yù)測
幀內(nèi)壓縮主要針對的時I幀的,解決的時空間的數(shù)據(jù)冗余。先通過一種計算,選擇想用的那種模式。對每個宏塊采用不同的模式運算,將產(chǎn)生每一個宏塊產(chǎn)生幀內(nèi)預(yù)測的模式。幀內(nèi)預(yù)測有九種模式。

幀內(nèi)壓縮:殘差數(shù)據(jù)+選擇每個宏塊的模式信息數(shù)據(jù)。解碼的時候,首先通過預(yù)測的模擬信息恢復(fù)出預(yù)測的圖,再將預(yù)測的圖與殘差值進行累加。就能還原出原始的圖像。

7.3 DCT壓縮
通過數(shù)字對宏塊進行量化,量化之后通過DCT數(shù)據(jù)方法進行壓縮。

7.4 VLC壓縮
上下文適應(yīng)無損壓縮技術(shù)。具體詳解
