I幀、B幀、P幀、NALU類型


i幀 i frame,即內部畫面 intra picture,通常是GOP的第一個幀(即IDR)
I幀是最大去除圖像空間冗余信息而壓縮得到的幀,自帶全部信息,不參考其他幀可獨立解碼,稱為幀內編碼幀
所有視頻至少包含一個I幀,且作為文件的第一個幀,文件里的其他的I幀用來改善視頻質量,但增加了文件大小
一般而言,每秒視頻至少需要1個I幀,每秒里增加I幀可以改善質量,但增加網絡帶寬和網絡負載
視頻播放過程中,若I幀丟失,則隨后的P幀也就無法解析,所以出現黑屏現象,若P幀丟失,則出現花屏、馬賽克現象

P幀,前向搜索幀/前向預測幀,以I幀預測P幀

B幀,雙向搜索幀/雙向內插幀,由I幀、P幀預測B幀


P幀壓縮:根據本幀與相鄰的前一幀(I幀或P幀)的不同點來壓縮本幀數據
P幀重構:以前面相鄰I幀為參考幀,計算P幀某點的預測值和運動矢量得到P幀某點樣值
B幀壓縮:根據本幀與相鄰的前一幀的差值、本幀與相鄰的后一幀的差值來壓縮本幀數據
B幀重構:以相鄰的前面相鄰幀(I或P)、后面相鄰幀(P)為參考,找出B幀某點的預測值和兩個運動矢量得到B幀某點樣值

I幀編碼減少空間域冗余,P、B幀編碼減少時間域冗余

NTSC = national television system committee 應用於美國、日本、加拿大、墨西哥等
PAL  = phase alternating line 應用於中國、香港、中東、歐洲
GOP  = group of pictures  其最大可含幀數量 18(NTSC)/15(PAL)
GOP是有固定模式的一系列I、P、B幀組成
常用結構由15幀(PAL)組成,具有以下形式IBBPBBPBBPBBPBB,簡稱GOP(4,2),指的是該圖像組除了1個I幀外,包含4個P幀,且
任何相鄰I、P之間或相鄰P、P之間存在2個B幀

IDR  = instantaneous decoding refresh 即時解碼刷新  IDR一定是I幀,但I幀不一定是IDR
為了區分幀序列的首個I幀和其他I幀,才定義首個I幀為IDR,解碼器只可以從IDR開始解碼,IDR表示一組新的幀序列GOP
在IDR幀之后的所有幀都不能引用該IDR之前的幀數據,在普通I幀之后的B、P幀可以引用該普通I幀之前的I幀
ID會導致DPB(decord picture buff 參考幀列表)清空,導致PPS、SPS參數更新

 

H264從結構上分為 視頻編碼層VCL(video coding layer)和網路抽象層NAL(network abstract layer)

VCL包括codec編解碼功能(基於宏塊模型)、運動補償預測處理、循環過濾器處理

NAL把VCL的輸出封裝成NALU(網絡抽象層單元),以適應基於包的網絡傳輸或面向包的多路復用環境

 

NALU的第1個字節是NUAL類型字節,其格式如下

|0 |1 |2 |3 |4 |5 |6 |7 |

|F |NRI|Type              |

F:       1 bit  forbidden_zero_bit H.264規范聲明值設置為1表示語法違例

NRI:  2 bit  nal_ref_idc 表示NALU的優先級。0--3,取值越大,該NALU越重要,需要優先保護

                                      00值表示該NALU不用於幀間圖像預測重構參考圖像,可以丟棄不用冒參考圖像完整性風險。

                                      如果NALU是參考幀slice、PPS、SPS時,該值必須大於0

Type: 5 bit  nal_unit_type 表示NALU載荷類型,類型值定義如下

                                         0:未定義

                                         1:非IDR圖像不采用數據划分片段

                                         2:非IDR圖像采用數據划分片段A部分

                                         3:非IDR圖像采用數據划分片段B部分

                                         4:非IDR圖像采用數據划分片段C部分

                                         5:IDR圖像片段

                                         6:補充增強信息 SEI

                                         7:序列參數集 SPS

                                         8:圖像參數集 PPS

                                         9:分隔符

                                         10:序列結束符

                                         11:流結束符

                                         12:填充數據

                                         13:序列參數集擴展

                                         14:帶前綴的NALU

                                         15:子序列參數集

                                         16-18:保留

                                         19:不采用數據划分的輔助編碼圖像片段

                                         20:編碼片段擴展

                                         21-23:保留

                                         24-31:未定義

h264數據幀的NALU前面帶有 00 00 00 01或 00 00 01 分隔符,一般VCL輸出首幀數據為PPS、SPS,接着是IDR幀

00 00 00 01 67 SPS 00 00 00 01 68 PPS 00 00 00 01 65 IDR ... ...

分隔符作為NALU的開始邊界和結束邊界,解碼器使用分隔符逐個字節匹配數據流,計算NALU的長度,然后開始解碼

 

h264 序列、幀、slice關系

從大到小依次為:序列、幀(I、P、B幀)、片組、片(I、P、B、SP、SI片)、NALU、宏塊、亞宏塊、塊、像素

 

序列

圖像以序列為單位進行組織,GOP,序列就是一段連續圖像幀且畫面之間變化不大。

統計一段時間內圖像的結果表明,相鄰幾幅圖像,一般像素存在差別的點只有10%以內,亮度差值變化不超過2%,

色度差值變化只有1%以內。所以一段連續的圖像畫面之間變化不大,可以把第1幀編碼為完整圖像幀,第2幀只編

碼其與前面一幀的差別,這樣第2幀只是前一幀的1/10或更小,依次對第2幀之后的圖像幀做同樣處理,這樣的一段

圖像就是一個序列。當某個幀與前面的幀圖像變化很大,無法參考前面幀生成時,就要開始一個新序列。

 

幀      :有1個或多個片組,如果不采用FMO(靈活宏塊排序)機制,則一幀只有一個片組

片組  :包含1個片(slice)或多個片

片      :slice,由宏塊組成,如果不采用DP(數據分割)機制,1個片只包含1個NALU,

               否則1個片由3個NALU組成,nal_unit_type值等於2、3、4的NALU屬於同一個片

               分片的目的是限制誤碼的擴撒和傳輸,使片間保持獨立,[ [slice header] [slice data] ]

               [slice header] 說明了片類型、屬於哪個幀、參考幀等

               [slice data] 里是整數個宏塊

宏塊   :編碼處理的基本單元,由多個塊組成,通常宏塊大小為16X16像素,分為I、B、P宏塊

塊       :一個編碼圖像要划分成多個塊才能進行處理,一個塊是4X4像素

圖像解碼過程是按照slice進行解碼,然后按照片組將解碼宏塊重組成圖像

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM