h264 NALU的獲取與分析

2021-07-25 04:01:39 字數 3743 閱讀 6081

0x00000001或0x000001是乙個nalu的起始標誌,遇到下乙個此標誌時為該nalu的結尾。起始標誌的後面第乙個位元組(type)裡包含有nalu的型別,type & 0x1f即為該nalu的型別(nal_unit_type),具體型別分析詳見下節。

nal_unit_type=7時,nalu為sps;nal_unit_type=8時,nalu為pps。

sps(sequence parameter set)序列引數集,pps(picture parameter set)影象引數集。sps和pps串,包含了初始化h.264解碼器所需要的資訊引數,包括編碼所用的profile,level,影象的寬和高,deblock濾波器等。如果對獲取的nalu去掉開始碼之後進行base64編碼,得到的資訊就可以用於sdp(sps和pps需要用逗號分隔開來)。下圖為乙個完整的sdp,sprop-parameter-sets為sps和pps的base64碼,逗號前的為sps,逗號後的為pps:

nal_unit_type=5是,nalu為i幀。

i幀全名叫「idr影象的編碼條帶」,俗稱關鍵幀,也叫幀內編碼幀 ,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀資料就可以完成(因為包含完整畫面)。

i幀特點:

1)它是乙個全幀壓縮編碼幀。它將全幀影象資訊進行jpeg壓縮編碼及傳輸;

2)解碼時僅用i幀的資料就可重構完整影象;

3)i幀描述了影象背景和運動主體的詳情;

4)i幀不需要參考其他畫面而生成;

5)i幀是p幀和b幀的參考幀(其質量直接影響到同組中以後各幀的質量);

6)i幀是幀組gop(group of pictures)的基礎幀(第一幀),在一組中只有乙個i幀;

7)i幀不需要考慮運動向量;

8)i幀所佔資料的資訊量比較大。

nal_unit_type=1時,nalu為「非idr影象的編碼條帶」

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幀記錄的是本幀與前後幀的差別(具體比較複雜,有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幀不是參考幀,不會造成解碼錯誤的擴散。

注:i、b、p各幀是根據壓縮演算法的需要,是人為定義的,它們都是實實在在的物理幀。一般來說,i幀的壓縮率是7(跟jpg差不多),p幀是20,b幀可以達到50。可見使用b幀能節省大量空間,節省出來的空間可以用來儲存多一些i幀,這樣在相同位元速率下,可以提供更好的畫質。

下圖為用ue開啟的乙個h264檔案:

段1:0x06 & 0x1f = 6,nalu為輔助增強資訊 (sei);

段2:0x67 & 0x1f = 7,nalu為sps;

段3:0x68 & 0x1f = 8,nalu為pps;

段4:0x65 & 0x1f = 5,nalu為i幀。

nal_unit_type型別列表:

nal_unit_type

nal 單元和 rbsp 語法結構的內容備註0

未指定1

乙個非idr影象的編碼條帶

slice_layer_without_partitioning_rbsp( )

2編碼條帶資料分割塊a

slice_data_partition_a_layer_rbsp( )

3編碼條帶資料分割塊b

slice_data_partition_b_layer_rbsp( )

4編碼條帶資料分割塊c

slice_data_partition_c_layer_rbsp( )

5idr影象的編碼條帶

slice_layer_without_partitioning_rbsp( )i幀6

輔助增強資訊 (sei)

sei_rbsp( )

7序列引數集

seq_parameter_set_rbsp( )

sps8

影象引數集

pic_parameter_set_rbsp( )

pps9

訪問單元分隔符

access_unit_delimiter_rbsp( )

10序列結尾

end_of_seq_rbsp( )

11流結尾

end_of_stream_rbsp( )

12填充資料

filler_data_rbsp( )

13序列引數集擴充套件

seq_parameter_set_extension_rbsp( )

14...18

保留19

未分割的輔助編碼影象的編碼條帶

slice_layer_without_partitioning_rbsp( )

20...23

保留24...31

未指定

下面是h264標準中定義的nalu型別巨集:

#define nalu_type_slice 1

#define nalu_type_dpa 2

#define nalu_type_dpb 3

#define nalu_type_dpc 4

#define nalu_type_idr 5

#define nalu_type_sei 6

#define nalu_type_sps 7

#define nalu_type_pps 8

#define nalu_type_aud 9

#define nalu_type_eoseq 10

#define nalu_type_eostream 11

#define nalu_type_fill 12

H264Nalu頭部解析

一 nalu頭部解析 f forbidden zero bit.在 h.264 規範中規定了這一位必須為 0.nri nal ref idc.取00 11,似乎指示這個nalu的重要性,如00的nalu解碼器可以丟棄它而不影響影象的回放,0 3,取值越大,表示當前nal越重要,需要優先受到保護。如果...

H264 NALU 使用PS封裝 RTP傳送

最近由於專案平台需求,要將h264 nalu封裝為ps再用rtp傳送,ps封裝按照iso dec 13818 1標準。乙個ps包包含ps header,pes header,ps system header,ps system map等。針對h264做如下ps封裝 1 每個idr nalu前一般都會...

H 263與H 264的比較

概述 會議電視公認的影象編碼標準協議是h系列,即itu t h.261 h.263和h.264協議。1995年之前,會議電視系統影象都採用h261編碼協議。二h263協議還是h264對比分析 h.264編碼標準正在被其它行業認同,h264有可能成為廣播 通訊和儲存 cd 的統一的標準,即成為未來寬頻...