1. 程式人生 > >H265碼流結構分析

H265碼流結構分析

文章目錄


最近了解了一下H265的碼流結構,對比H264的碼流結構做了一些分析,簡單記錄一下,對輸入的內容做個輸出,防止忘記

1 準備工作

1.1 H265視訊檔案

稍後需要對H265視訊檔案進行分析,所以直接下載live555官網中提供的h265視訊檔案:

http://www.live555.com/liveMedia/public/265/

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學習筆記之二:碼流分析

https://blog.csdn.net/c250456789/article/details/62427968

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。