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 的統一的標準,即成為未來寬頻...