H264H265視頻編解碼算法文章匯總
怎樣解析一幀圖像的Slice結構滑沧,目前測試的碼流都是幀編碼全部是I幀俩滥,一個圖像序列(尤其是I幀和IDR幀)的Slice結構是怎樣的?
1.Slice的概念
H.264的碼流結構可以分為兩層:
網(wǎng)絡抽象層NAL:用于傳輸?shù)亩M制碼流包
視頻編碼層VCL:保存原始視頻的圖像數(shù)據(jù)
H.264的條帶:Slice
表示視頻圖像數(shù)據(jù)的NAL Unit包含的語法元素
IDR Slice NAL type: 5
non-IDR Slice NAL type: 1
一個Slice包含了一幀圖像的全部或部分數(shù)據(jù)荚醒,換言之芋类,一幀的視頻圖像可以編碼為1個或多個Slice,每個Slice至少要包含一個宏塊最多能包含整幀圖像的數(shù)據(jù)界阁,在不同的編碼實現(xiàn)中侯繁,同一幀圖像所組成的Slice數(shù)目不一定相同,一幀圖像本來編碼為1個Slice泡躯,修改編碼配置可能分為多個Slice進行編碼
一個Slice:
- 包含某一幀的全部或部分數(shù)據(jù)
定義Slice的意義:
防止誤碼的擴散
不同的slice之間贮竟,其解碼操作獨立丽焊;
某一個slice的解碼過程所參考的數(shù)據(jù)(例如預測編碼)不能越過slice的邊界
如果一個Slice中產(chǎn)生誤碼,此誤碼只產(chǎn)生在Slice之內坝锰,不會影響相應的Slice的解碼正常進行
2.Slice的類型
根據(jù)碼流中不同的數(shù)據(jù)類型粹懒,H.264標準中共定義了5總Slice類型:
I slice: 幀內編碼的條帶重付;I slice可以不依賴其他數(shù)據(jù)進行解碼顷级,因此不能包含P slice(宏塊)或B slice(宏塊)
P slice: 單向幀間編碼的條帶;也可包含I slice(宏塊)确垫,并不在少數(shù)弓颈,若采用I Slice使用最少的代價,就會使用I Slice(宏塊)
B slice: 雙向幀間編碼的條帶删掀;也可包含I slice(宏塊)翔冀,并不在少數(shù),若采用I Slice使用最少的代價,就會使用I Slice(宏塊)
SI slice: 切換I條帶披泪,用于擴展檔次中碼流切換使用纤子;
SP slice: 切換P條帶,用于擴展檔次中碼流切換使用款票;
S表示Switch切換的意思
3.Slice的組成
Slice Header: 保存Slice的總體信息
Slice Body: 一組連續(xù)的宏塊結構(或者宏塊跳過信息)
- image.png
first_mb_in_slice:大多數(shù)情況下一幀圖像被編碼成一個Slice,這一幀的Slice的第一個宏塊自然就是這一幀的左上角的數(shù)據(jù)了這個值為0
slice_type:slice的類型控硼,在Nal Unit中只區(qū)分了type為5或1,IDR幀或非IDR幀艾少,非IDR幀可能會有好多種slice卡乾,可通過以下表格判斷,slice_type specifies the coding type of the slice according to Table 7-6.,前面0缚够,1幔妨,2,3谍椅,4五個數(shù)值即可區(qū)分
pic_parameter_set_id:依賴于哪一個pps的值
colour_plane_id:當前處理的是哪一個顏色分量误堡,只有在YUV三個分量分開處理的時候才有效,為0雏吭,1锁施,2的時候分別表示Y,U,V三個分量
frame_num:和pic_order_cnt_lsb都是表示度量當前幀順序的序號,只不過兩者表示的含義不一樣思恐,差距主要體現(xiàn)在幀間編碼上沾谜,攜帶了P幀或B幀的時候,研究幀間編碼的時候詳細解答
field_pic_flag:在frame_mbs_only_flag為假的時候才存在胀莹,也就是非幀編碼的時候才存在基跑,表示當前Slice是幀編碼還是場編碼,標志位也稱為場編碼標志位描焰,為1媳否,當前Slice按照場編碼來處理栅螟,為0,按幀編碼處理
bottom_field_flag:底場標志位篱竭,為1表示處理的是頂場和底場中的底場力图,為0,表示頂場
idr_pic_id:如果為IDR slice掺逼,需要idr_pic_id,如果IDR被編碼為了多個Slice吃媒,每個Slice的idr_pic_id必須一樣,取值范圍為0~65535之間
pic_order_cnt_lsb:度量圖像順序的標號
下面暫時忽略
進行幀間編碼時會用到
slice_qp_delta:計算當前Slice的初始量化參數(shù)值吕喘,pps中的參數(shù)pic_init_qp_minus26表示一個pps管理的一個gop的整體初始量化參數(shù),加上26表示每一個pic_init_qp的值赘那,到了每一個Slice之中,可以通過slice_qp_delta進行調整氯质,slice_qp_delta有更強的靈活性
后面的對示例中I幀的視頻解析是不需要的募舟,保留字段
代碼中還需要定義dec_ref_pic_marking( ),目前例子中解析的是IDR幀闻察,只包含兩個語法元素就可以了
no_output_of_prior_pics_flag
long_term_reference_flag
若解析非IDR幀拱礁,還需要以下元素
當sps中的separate_colour_plane_flag = = 1時存在元素colour_plane_id
frame_num的長度取決于sps中l(wèi)og2_max_frame_num_minus4