H265碼流結構分析
文章目錄
最近了解了一下H265的碼流結構,對比H264的碼流結構做了一些分析,簡單記錄一下,對輸入的內容做個輸出,防止忘記
1 準備工作
1.1 H265視訊檔案
稍後需要對H265視訊檔案進行分析,所以直接下載live555官網中提供的h265視訊檔案:
1.2 參考文件
H264碼流結構文件直接參考海思中的說明:
《H.264 PC解碼庫軟體開發指南.pdf》
H265碼流結構文件參考:
《T-REC-H.265-201504-I!!PDF-E.pdf》
1.3 參考博文
h265 Nalu型別判斷及 sps 資料解析
https://blog.csdn.net/machh/article/details/72190321
HEVC碼流解析
https://blog.csdn.net/CrystalShaw/article/details/80624804
H.265/HEVC學習筆記之二:碼流分析
2 分析
關於SPS/PPS/IDR/P/B等概念這裡就不再詳細說明。H264和H265的每一個NALU字首碼也是一樣的,即“0x00 00 00 01”或者 “0x00 00 01”。
H265相比較於H264,多了一些概念,例如VPS,目前對這個引數還在瞭解中,詳細瞭解可以參考博文:
HEVC編碼結構:序列引數集SPS、影象引數集PPS、視訊引數集VPS
https://blog.csdn.net/lin453701006/article/details/52797104
2.1 NALU type
2.1.1 H264
在H264中,每一個字首碼後面跟隨的第一個位元組即為NALU的語法元素,主要有三部分組成:
forbidden_bit(1bit),nal_reference_bit(2bits)(優先順序),nal_unit_type(5bits)(型別)
所以,在H264中,我們如果需要獲取NALU的型別,則可以通過以下方式進行解析:
nalu_type = first_byte_in_nal & 0x1F
nalu_type如下所示:
2.1.2 H265
而在H265中,每一個字首碼後面跟隨的前兩個位元組為NALU的語法元素,主要有四部分組成:
forbidden_zero_bit(1):nal_unit_type(6):nuh_layer_id(6):nuh_temporal_id_plus1(3)
在文件中定義如下:
可以看到,NALU的語法元素由H264的一個位元組變為兩個位元組,而nal_unit_type則為NALU的型別,因此我們可以通過以下獲取NALU的型別:
int type = (code & 0x7E)>>1;
type的定義值如下:
上圖,即為H265的NALU的TYPE,這裡可以將上面的type簡單的理解為如下我們需要的型別:
VPS=32 SPS=33 PPS=34 IDR=19 P=1 B=0
2.2 例項分析
如下,為下載的視訊檔案surfing.265的頭部資訊
如上我們看到了四個NALU包,每個NALU的頭部資訊為:
① 00 00 00 01 40 01 ---> (0x40 & 0x7E)>>1 = 32 ---> VPS
② 00 00 00 01 42 01 ---> (0x42 & 0x7E)>>1 = 33 ---> SPS
③ 00 00 00 01 44 01 ---> (0x44 & 0x7E)>>1 = 34 ---> PPS
④ 00 00 00 01 26 01 ---> (0x26 & 0x7E)>>1 = 19 ---> IDR
通過以上頭結構也可以看到,NALU的與語法元素中,forbidden_zero_bit通常為0,nuh_layer_id通常為0,nuh_temporal_id_plus1通常為1。