天天看点

H.264/H265的NAL解析1、H.264的NAL解析

1、H.264的NAL解析

    在有序字节流格式的H.264码流中,我们可以根据前缀起始码0x 00 00 01或0x 00 00 01获取到一个完整的NAL Unit所包含的的字节数据。H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用。因此将H.264的码流解析为NAL Unit之后,下一步将是对NAL Unit中的数据进行解析。

NAL Unit结构

H.264标准中规定的一个NAL Unit的结构如下图:

H.264/H265的NAL解析1、H.264的NAL解析

一个NAL Unit都是由一个NAL Header和一个NAL Body组成。对于基本版本的H.264标准(不考虑SVC和MVC扩展),一个NAL Header的长度固定为1,即8bit。这8bit的含义分别为:

forbidden_zero_bit:每一个NAL Header的第一个bit,规定必须为0;

nal_ref_idc:第2和3位,主要表示NAL的优先级。当该值为正时,表示当前NAL Unit中包含了SPS、PPS和作为参考帧的Slice等重要数据。

nal_unit_type:表示NAL Unit的类型,包括VCL层和非VCL层的多种数据类型。常见的nal_unit_type取值有:7表示SPS,8表示PPS,5表示IDR帧,1表示非IDR帧等。

2、H.265的NAL解析

首先来介绍下h265(HEVC)nal单元头,与h264的nal层相比,h265的nal unit header有两个字节构成

H.264/H265的NAL解析1、H.264的NAL解析

从图中可以看出hHEVC的nal包结构与h264有明显的不同,hevc加入了nal所在的时间层的ID,取去除了nal_ref_idc,此信息合并到了naltype中,

通常情况下F为0,layerid为0,  TID为1。

H265 帧类型判断:和H264的&0x1f不同。H265是 :int type = (code & 0x7E)>>1;

#define HEVC_VPS  0x40

#define HEVC_SPS  0x42

#define HEVC_PPS  0x44

#define HEVC_SEI  0x4E

#define HEVC_IDR  0x26

#define HEVC_PSLICE  0x02

继续阅读