H264是新一代的編碼標準,以高壓縮高質量和支持多種網絡的流媒體傳輸著稱,在編碼方面,我理解的他的理論依據是:參照一段時間內圖像的統計結果代表,在相鄰幾幅圖像畫面中,通常有差異的像素只有10%之內的點,亮度差值變化不超過2%,而色度差值的變化只有1%之內。因此對於一段變化不大圖像畫面,咱們能夠先編碼出一個完整的圖像幀A,隨後的B幀就不編碼所有圖像,只寫入與A幀的差異,這樣B幀的大小就只有完整幀的1/10或更小!B幀以後的C幀若是變化不大,咱們能夠繼續以參考B的方式編碼C幀,這樣循環下去。這段圖像咱們稱爲一個序列(序列就是有相同特色的一段數據),當某個圖像與以前的圖像變化很大,沒法參考前面的幀來生成,那咱們就結束上一個序列,開始下一段序列,也就是對這個圖像生成一個完整幀A1,隨後的圖像就參考A1生成,只寫入與A1的差異內容。
在H264協議裏定義了三種幀,完整編碼的幀叫I幀,參考以前的I幀生成的只包含差別部分編碼的幀叫P幀,還有一種參考先後的幀編碼的幀叫B幀。
H264採用的核心算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。算法
序列的說明
在H264中圖像以序列爲單位進行組織,一個序列是一段圖像編碼後的數據流,以I幀開始,到下一個I幀結束。
一個序列的第一個圖像叫作 IDR 圖像(當即刷新圖像),IDR 圖像都是 I 幀圖像。H.264 引入 IDR 圖像是爲了解碼的重同步,當解碼器解碼到 IDR 圖像時,當即將參考幀隊列清空,將已解碼的數據所有輸出或拋棄,從新查找參數集,開始一個新的序列。這樣,若是前一個序列出現重大錯誤,在這裏能夠得到從新同步的機會。IDR圖像以後的圖像永遠不會使用IDR以前的圖像的數據來解碼。
一個序列就是一段內容差別不太大的圖像編碼後生成的一串數據流。當運動變化比較少時,一個序列能夠很長,由於運動變化少就表明圖像畫面的內容變更很小,因此就能夠編一個I幀,而後一直P幀、B幀了。當運動變化多時,可能一個序列就比較短了,好比就包含一個I幀和三、4個P幀。緩存
三種幀的說明網絡
一、I幀
I幀:幀內編碼幀 ,I幀表示關鍵幀,你能夠理解爲這一幀畫面的完整保留;解碼時只須要本幀數據就能夠完成(由於包含完整畫面)
I幀特色:
1)它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸;
2)解碼時僅用I幀的數據就可重構完整圖像;
3)I幀描述了圖像背景和運動主體的詳情;
4)I幀不須要參考其餘畫面而生成;
5)I幀是P幀和B幀的參考幀(其質量直接影響到同組中之後各幀的質量);
6)I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀;
7)I幀不須要考慮運動矢量;
8)I幀所佔數據的信息量比較大。less
二、P幀 編碼
P幀:前向預測編碼幀。P幀表示的是這一幀跟以前的一個關鍵幀(或P幀)的差異,解碼時須要用以前緩存的畫面疊加上本幀定義的差異,生成最終畫面。(也就是差異幀,P幀沒有完整畫面數據,只有與前一幀的畫面差異的數據)
P幀的預測與重構:P幀是以I幀爲參考幀,在I幀中找出P幀「某點」的預測值和運動矢量,取預測差值和運動矢量一塊兒傳送。在接收端根據運動矢量從I幀中找出P幀「某點」的預測值並與差值相加以獲得P幀「某點」樣值,從而可獲得完整的P幀。
P幀特色:
1)P幀是I幀後面相隔1~2幀的編碼幀;
2)P幀採用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測偏差);
3)解碼時必須將I幀中的預測值與預測偏差求和後才能重構完整的P幀圖像;
4)P幀屬於前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀;
5)P幀能夠是其後面P幀的參考幀,也能夠是其先後的B幀的參考幀;
6)因爲P幀是參考幀,它可能形成解碼錯誤的擴散;
7)因爲是差值傳送,P幀的壓縮比較高。視頻
三、B幀隊列
B幀:雙向預測內插編碼幀。B幀是雙向差異幀,也就是B幀記錄的是本幀與先後幀的差異(具體比較複雜,有4種狀況,但我這樣說簡單些),換言之,要解碼B幀,不只要取得以前的緩存畫面,還要解碼以後的畫面,經過先後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,可是解碼時CPU會比較累。
B幀的預測與重構
B幀之前面的I或P幀和後面的P幀爲參考幀,「找出」B幀「某點」的預測值和兩個運動矢量,並取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中「找出(算出)」預測值並與差值求和,獲得B幀「某點」樣值,從而可獲得完整的B幀。
B幀特色
1)B幀是由前面的I或P幀和後面的P幀來進行預測的;
2)B幀傳送的是它與前面的I或P幀和後面的P幀之間的預測偏差及運動矢量;
3)B幀是雙向預測編碼幀;
4)B幀壓縮比最高,由於它只反映丙參考幀間運動主體的變化狀況,預測比較準確;
5)B幀不是參考幀,不會形成解碼錯誤的擴散。ci
注:I、B、P各幀是根據壓縮算法的須要,是人爲定義的,它們都是實實在在的物理幀。通常來講,I幀的壓縮率是7(跟JPG差很少),P幀是20,B幀能夠達到50。可見使用B幀能節省大量空間,節省出來的空間能夠用來保存多一些I幀,這樣在相同碼率下,能夠提供更好的畫質。同步
壓縮算法的說明
h264的壓縮方法:
1.分組:把幾幀圖像分爲一組(GOP,也就是一個序列),爲防止運動變化,幀數不宜取多。
2.定義幀:將每組內各幀圖像定義爲三種類型,即I幀、B幀和P幀;
3.預測幀:以I幀作爲基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;
4.數據傳輸:最後將I幀數據與預測的差值信息進行存儲和傳輸。
幀內(Intraframe)壓縮也稱爲空間壓縮(Spatial compression)。當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗餘信息,這實際上與靜態圖像壓縮相似。幀內通常採用有損壓縮算法,因爲幀內壓縮是編碼一個完整的圖像,因此能夠獨立的解碼、顯示。幀內壓縮通常達不到很高的壓縮,跟編碼jpeg差很少。
幀間(Interframe)壓縮的原理是:相鄰幾幀的數據有很大的相關性,或者說先後兩幀信息變化很小的特色。也即連續的視頻其相鄰幀之間具備冗餘信息,根據這一特性,壓縮相鄰幀之間的冗餘量就能夠進一步提升壓縮量,減少壓縮比。幀間壓縮也稱爲時間壓縮(Temporal compression),它經過比較時間軸上不一樣幀之間的數據進行壓縮。幀間壓縮通常是無損的。幀差值(Frame differencing)算法是一種典型的時間壓縮法,它經過比較本幀與相鄰幀之間的差別,僅記錄本幀與其相鄰幀的差值,這樣能夠大大減小數據量。
順便說下有損(Lossy )壓縮和無損(Lossy less)壓縮。無損壓縮也即壓縮前和解壓縮後的數據徹底一致。多數的無損壓縮都採用RLE行程編碼算法。有損壓縮意味着解壓縮後的數據與壓縮前的數據不一致。在壓縮的過程當中要丟失一些人眼和人耳所不敏感的圖像或音頻信息,並且丟失的信息不可恢復。幾乎全部高壓縮的算法都採用有損壓縮,這樣才能達到低數據率的目標。丟失的數據率與壓縮比有關,壓縮比越小,丟失的數據越多,解壓縮後的效果通常越差。此外,某些有損壓縮算法採用屢次重複壓縮的方式,這樣還會引發額外的數據丟失。io