H.264,一般也被稱之爲H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)html
H.264的出現就是爲了建立比之前的視頻壓縮標準更高效的壓縮標準,使用更好高效的視頻壓縮算法來壓縮視頻的佔用空間,提升存儲和傳輸的效率,在得到有效的壓縮效果的同時,使得壓縮過程引發的失真最小。MPEG-4 AVC和H.264 是目前較爲主流的編碼標準。主要定義了兩方面的內容:視頻數據壓縮形式的編碼表示和用重建視頻信息的語法來描述編碼方法。目的是爲了保證兼容的編碼器可以成功的交互工做,同時也容許製造廠商自由的開發具備競爭力的創新產品。製造廠商只須要注意的事情就是可以得到和標準中採用的方法一樣的結果。git
提到H.264編解碼,咱們先簡單說一下視頻壓縮算法。視頻壓縮算法是經過去除時間、空間的冗餘來實現的。在一段時間內,相鄰的圖像的像素、亮度與色溫的差異很小,咱們沒比要對每個圖像進行完成的編碼,而是能夠選取這段時間的第一張圖(也就是第一幀)做爲完整的編碼,然後面一段時間的圖像只須要記錄與第一張圖(第一幀)在像素、亮度、色溫等方面的差異數據便可。經過去除不一樣類型的冗餘,能夠明顯的壓縮數據,代價就是一部分信息失真。github
H.264編解碼在整個視頻數據處理過程當中,屬於視頻數據處理的編解碼層,具體的能夠查看本人總結的編解碼流程圖中的解碼部分:Thinking-in-AV/音視頻編解碼/音視頻解碼流程概覽.png。編碼部分將流程反過來進行理解便可。算法
在H.264定義的結構中,一個視頻圖像編碼後的數據叫作一幀。 一幀是由一個或多個片(slice)組成的,一個片是由一個或多個宏塊(MB)組成的(宏塊是H264編碼的基本單位),一個宏塊是由16x16的yuv數據組成的。網絡
在H.264的協議中,定義了三類幀,分別是I幀、B幀和P幀。其中I幀就是以前咱們所說的一個完整的圖像幀,而B幀和P幀對應的就是以前說的不對所有圖像作編碼的幀。B幀和P幀的差異在於,P幀是參考以前的I幀生成的,B幀是參考先後的圖像幀生成的。框架
在視頻畫面播放過程當中,若I幀丟失了,則後面的P幀也就隨着解不出來,就會出現視頻畫面黑屏的現象;若P幀丟失了,則視頻畫面會出現花屏、馬賽克等現象。ide
一個GOP(Group Of Picture)就是一組連續的畫面。GOP結構通常有兩個數字,其中一個是GOP的長度(即兩個I幀之間的B幀和P幀數),另外一個數字爲I幀和P幀之間的間隔距離(即B幀數)。在一個GOP內I幀解碼不依賴任何的其它幀,P幀解碼則依賴前面的I幀或P幀,B幀解碼依賴前面的I幀或P幀及其後最近的一個P幀。性能
注意:在碼率不變的前提下,GOP值越大,P、B幀的數量會越多,平均每一個I、P、B幀所佔用的字節數就越多,也就更容易獲取較好的圖像質量;Reference越大,B幀的數量越多,同理也更容易得到較好的圖像質量。可是經過提升GOP值來提升圖像質量是有限度的。H264編碼器在遇到場景切換的狀況時,會自動強制插入一個I幀,此時實際的GOP值被縮短了。另外一方面,在一個GOP中,P、B幀是由I幀預測獲得的,當I幀的圖像質量比較差時,會影響到一個GOP中後續P、B幀的圖像質量,直到下一個GOP開始纔有可能得以恢復,因此GOP值也不宜設置過大。同時,因爲P、B幀的複雜度大於I幀,因此過多的P、B幀會影響編碼效率,使編碼效率下降。另外,過長的GOP還會影響Seek操做的響應速度,因爲P、B幀是由前面的I或P幀預測獲得的,因此Seek操做須要直接定位,解碼某一個P或B幀時,須要先解碼獲得本GOP內的I幀及以前的N個預測幀才能夠,GOP值越長,須要解碼的預測幀就越多,seek響應的時間也越長。ui
GOP中的I幀又分爲普通I幀和IDR幀,IDR幀就是GOP的第一個I幀,這樣區分視爲了方便控制編碼和解碼的流程。 IDR幀必定是I幀,可是I幀不必定是IDR幀。編碼
IDR幀由於附帶SPS、PPS等信息,解碼器在收到 IDR 幀時,須要作的工做就是:把全部的 PPS 和 SPS 參數進行更新。
能夠看出來IDR幀的做用是讓解碼器馬上刷新相關數據信息,避免出現較大的解碼錯誤問題。
引入IDR幀機制是爲了解碼的重同步,當解碼器解碼到 IDR幀時,當即將參考幀隊列清空,將已解碼的數據所有輸出或拋棄,從新查找參數集,開始一個新的序列。這樣,若是前一個序列出現錯誤,在這裏能夠得到從新同步的機會。IDR幀以後的幀永遠不會使用IDR幀以前的數據來解碼。
H264 的核心壓縮算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。
幀內(Intraframe)壓縮的原理是:當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗餘信息,通常採用有損壓縮算法,因爲幀內壓縮是編碼一個完整的圖像,因此能夠獨立的解碼、顯示。幀內壓縮率通常不高。
幀間(Interframe)壓縮的原理是:相鄰幾幀的數據有很大的相關性,或者說先後兩幀信息變化很小的特色。連續的視頻其相鄰幀之間具備冗餘信息,根據這一特性,壓縮相鄰幀之間的冗餘量就能夠進一步提升壓縮量,減少壓縮比。
而幀間壓縮也稱爲時間壓縮(Temporalcompression),它經過比較時間軸上不一樣幀之間的數據進行壓縮。幀間壓縮是無損的,它經過比較本幀與相鄰幀之間的差別,僅記錄本幀與其相鄰幀的差值,這樣能夠大大減小數據量。
H.264壓縮視頻數據時的具體方式以下:
a). 分組,也就是將一系列變換不大的圖像歸爲一個組,即一個GOP;
b). 定義幀,將每組的圖像幀歸分爲I幀、P幀和B幀三種類型;
c). 預測幀, 以I幀作爲基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;
d). 數據傳輸, 最後將I幀數據與預測的差值信息進行存儲和傳輸。
H.264的主要目標是爲了有高的視頻壓縮比和良好的網絡親和性,H264將系統框架分爲兩個層面,分別是視頻編碼層面(VCL)和網絡抽象層面(NAL)。
VLC層:包括核心壓縮引擎和塊,宏塊和片的語法級別定義,設計目標是儘量地獨立於網絡進行高效的編碼;
NAL層:負責將VCL產生的比特字符串適配到各類各樣的網絡和多元環境中,覆蓋了全部片級以上的語法級別。
H.264原始碼流(裸流)是由一個接一個NALU組成,結構以下圖,一個NALU = 一組對應於視頻編碼的NALU頭部信息 + 一個原始字節序列負荷(RBSP,Raw Byte Sequence Payload)。
一個原始的H.264 NALU 單元常由 [StartCode] [NALU Header] [NALU Payload] 三部分組成。
Start Code 用於標示這是一個NALU 單元的開始,必須是」00 00 00 01」 或」00 00 01」。
NAL Header由三部分組成,forbidden_bit(1bit),nal_reference_bit(2bits)(優先級),nal_unit_type(5bits)(類型)。
下圖是RBSP的序列的樣例及相關類型參數的描述表:
SPS是序列參數集,包含的是針對一連續編碼視頻序列的參數,如標識符 seq_parameter_set_id、幀數及 POC 的約束、參考幀數目、解碼圖像尺寸和幀場編碼模式選擇標識等等。
PPS是圖像參數集,對應的是一個序列中某一幅圖像或者某幾幅圖像,其參數如標識符 pic_parameter_set_id、可選的 seq_parameter_set_id、熵編碼模式選擇標識、片組數目、初始量化參數和去方塊濾波係數調整標識等等。
參數集是一個獨立的數據單位,不依賴於參數集以外的其餘句法元素。一個參數集不對應某一個特定的圖像或者序列,同一個序列參數集能夠被一個或者多個圖像參數集引用。同理,一個圖像參數集也能夠被一個或者多個圖像引用。只有在編碼器認爲須要更新參數集的內容時,纔會發出新的參數集。
隨着數字視頻應用產業鏈的快速發展,視頻應用向如下幾個方向發展的趨勢越發明顯:
(1) 高清晰度(HigherDefinition):數字視頻的應用格式從720P向1080P全面升級,並且如今4K的數字視頻格式也已經成爲常見。
(2) 高幀率(Higherframe rate ):數字視頻幀率從30fps向60fps、120fps甚至240fps的應用場景升級;
(3) 高壓縮率(HigherCompression rate ):傳輸帶寬和存儲空間一直是視頻應用中最爲關鍵的資源,所以,在有限的空間和管道中得到最佳的視頻體驗一直是用戶的不懈追求。
可是面對視頻應用不斷向高清晰度、高幀率、高壓縮率方向發展的趨勢,當前主流的視頻壓縮標準協議H.264的侷限性不斷凸顯。主要體如今:
(1) 宏塊個數的爆發式增加,會致使用於編碼宏塊的預測模式、運動矢量、參考幀索引和量化級等宏塊級參數信息所佔用的碼字過多,用於編碼殘差部分的碼字明顯減小。
(2) 因爲分辨率的大大增長,單個宏塊所表示的圖像內容的信息大大減小,這將致使相鄰的4 x 4或8 x 8塊變換後的低頻係數類似程度也大大提升,致使出現大量的冗餘。
(3) 因爲分辨率的大大增長,表示同一個運動的運動矢量的幅值將大大增長,H.264中採用一個運動矢量預測值,對運動矢量差編碼使用的是哥倫布指數編碼,該編碼方式的特色是數值越小使用的比特數越少。所以,隨着運動矢量幅值的大幅增長,H.264中用來對運動矢量進行預測以及編碼的方法壓縮率將逐漸下降。
(4) H.264的一些關鍵算法例如採用CAVLC和CABAC兩種基於上下文的熵編碼方法、deblock濾波等都要求串行編碼,並行度比較低。針對GPU/DSP/FPGA/ASIC等並行化程度很是高的CPU,H.264的這種串行化處理愈來愈成爲制約運算性能的瓶頸。
因而面向更高清晰度、更高幀率、更高壓縮率視頻應用的HEVC(H.265)協議標準應運而生。H.265在H.264標準2~4倍的複雜度基礎上,將壓縮效率提高一倍以上。
(注意:實際使用過程當中,不能忽視265專利費用這個重要的問題。專利問題參考:H.265成超級提款機 一場圍繞專利受權的戰爭已經爆發)