原文地址: http://www.reibang.com/p/9542deb09a42
1橘券、概念
什么是NALU?
H264碼流可以分為兩層蚁堤,VCL層和NAL層遭居,NAL的全稱是Network abstraction layer,叫網(wǎng)絡(luò)抽象層,它保存了H264相關(guān)的參數(shù)信息和圖像信息玛追,NAL層由多個(gè)單元NALU組成,NALU由了NALU頭(00 00 00 01或者00 00 01)税课、sps(序列參數(shù)集)、pps(圖像參數(shù)集合)痊剖、slice韩玩、sei、IDR幀陆馁、I幀(在圖像運(yùn)動變化較少時(shí)找颓,I幀后面是7個(gè)P幀,如果圖像運(yùn)動變化大時(shí)叮贩,一個(gè)序列就短了击狮,I幀后面可能是3個(gè)或者4個(gè)P幀)、P幀益老、B幀等數(shù)據(jù)帘不。-
sps、pps杨箭、I幀寞焙、P幀在NALU中的關(guān)系和nalu type判斷
一個(gè)完整的NALU單元結(jié)構(gòu)圖如下:
是NALU頭,是序列的標(biāo)識符的開頭
轉(zhuǎn)成二進(jìn)制是
,
轉(zhuǎn)成十進(jìn)制是
捣郊,那么
對應(yīng)
轉(zhuǎn)成二進(jìn)制是
辽狈,轉(zhuǎn)成十進(jìn)制是
,
對應(yīng)
轉(zhuǎn)成二進(jìn)制是
呛牲,
轉(zhuǎn)成十進(jìn)制是
刮萌,
對應(yīng)的
(使用FFMPEG,sps和pps是保存在AVCodecContext的extradata.data中娘扩,在解碼提取sps和pps時(shí)着茸,判斷NALU type可以用extradata.data[ 4 ]&0x1f(結(jié)果是7是sps,8是pps琐旁,計(jì)算方式是先轉(zhuǎn)成二進(jìn)制涮阔,0x27&0x1f=11111&00111=00111=7,pps計(jì)算類似))灰殴,
敬特,splice有三種編碼模式,I_slice牺陶、P_slice伟阔、B_slice,I幀在編碼時(shí)就分割保存在splice中。
NALU type值對應(yīng)表如下:
NALU type | NALU 類型 |
---|---|
1 | NALU_TYPE_SLICE |
2 | NALU_TYPE_DPA |
3 | NALU_TYPE_DPB |
4 | NALU_TYPE_DPB |
5 | NALU_TYPE_IDR |
6 | NALU_TYPE_SEI |
7 | NALU_TYPE_SPS |
8 | NALU_TYPE_PPS |
9 | NALU_TYPE_AUD |
10 | NALU_TYPE_EOSEQ |
11 | NALU_TYPE_EOSTREAM |
12 | NALU_TYPE_FILL |
-
IDR幀和I幀的關(guān)系
掰伸,在一個(gè)完整的視頻流單元中第一個(gè)圖像幀是IDR幀皱炉,IDR幀是強(qiáng)制刷新幀,在解碼過程中狮鸭,當(dāng)出現(xiàn)了IDR幀時(shí)合搅,要更新sps、pps怕篷,原因是防止前面I幀錯誤,導(dǎo)致sps酗昼,pps參考I幀導(dǎo)致無法糾正廊谓。
再普及一個(gè)概念是GOP,GOP的全稱是Group of picture圖像組麻削,也就是兩個(gè)I幀之間的距離蒸痹,GOP值越大,那么I幀率之間P幀和B幀數(shù)量越多呛哟,圖像畫質(zhì)越精細(xì)叠荠,如果GOP是120,如果分辨率是720P扫责,幀率是60榛鼎,那么兩I幀的時(shí)間就是120/60=2s.