稍后需要对H265视频文件进行分析,所以直接下载live555官网中提供的h265视频文件:
http://www.live555.com/liveMedia/public/265/
H264码流结构文档直接参考海思中的说明:
《H.264 PC解码库软件开发指南.pdf》
H265码流结构文档参考:
《T-REC-H.265-201504-I!!PDF-E.pdf》
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
关于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
在H264中,每一个前缀码后面跟随的第一个字节即为NALU的语法元素,主要有三部分组成:
forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)
所以,在H264中,我们如果需要获取NALU的类型,则可以通过以下方式进行解析:
nalu_type = first_byte_in_nal & 0x1F
而在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
如下,为下载的视频文件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。