流媒体开发中H264编码NALU结构介绍与I帧判断方法

H264编码技术介绍

H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个数字视频编码标准。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。H.264是ITU-T以H.26x系列为名称命名的标准之一,同时AVC是ISO/IEC MPEG一方的称呼。

H.264标准的主要目标是:与其它现有的视频编码标准相比,在相同的带宽下提供更加优秀的图象质量。通过该标准,在同等图象质量下的压缩效率比以前的标准(MPEG2)提高了2倍左右,因此,H.264被普遍认为是最有影响力的行业标准。

H264编码NALU结构介绍与I帧判断

在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。因此我们平时的每帧数据就是一个NAL单元(SPS与PPS除外)。在实际的H264数据帧中,往往帧前面带有00 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为I帧……

4545f0a89d35c2051b373c7e97b505c946cf53af.jpg

帧是组成视频图像的基本单位。关键帧也叫I帧,它是帧间压缩编码里的重要帧;它是一个全帧压缩的编码帧;解码时仅用I帧的数据就可重构完整图像;I帧不需要参考其他画面而生成。视频文件是由多个连续的图片组成。

H264 NALU固定以 0x00 00 00 01为起始,NALU_data部分不会出现这个起始码;在找到下一个起始码之前,当前NALU数据长度不知;

H264 NALU: 00 00 00 01(4字节) NALU type(1字节) NALU_data (N字节) 0x00 00 00 01
起始码(4字节) 类型 数据 下一个NALU

NALU_type 1字节,定义为:

1比特禁止位 2比特 重要性指示位 5比特 类型
固定为0 11 1-12 由h264使用
常用Nalu_type:

0x67 (0 11 00111) SPS    非常重要       type = 7
0x68 (0 11 01000) PPS     非常重要       type = 8
0x65 (0 11 00101) IDR帧  关键帧  非常重要 type = 5
0x61 (0 11 00001) I帧        重要         type=1   非IDR的I帧 不大常见
0x41 (0 10 00001) P帧      重要         type = 1     
0x01 (0 00 00001) B帧     不重要        type = 1
0x06 (0 00 00110) SEI     不重要        type = 6

所以判断是否为I帧的算法为:
(NALU类型&0001 1111)=5 即 NALU类型&31=5,比如 0x65&31=5

猜你喜欢

转载自www.cnblogs.com/EasyNVR/p/11971702.html