h264的帧

一.看h264的帧

SPS序列参数帧

00 00 00 01 67 64 。。。。

PPS图像参数帧

00 00 00 01 68 EE。。。。

I帧

00 00 00 01 65 EE。。。。

P帧

00 00 00 01 61 E0 。。。


二、NALU

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

如下图:

h264的帧

2、如何判断帧类型(是图像参考帧还是I、P帧等)?

h264的帧

     NALU类型是我们判断帧类型的利器,从官方文档中得出如下图:

我们还是接着看最上面图的码流对应的数据来层层分析,以00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序为从左往右算,如下:(1)第1位禁止位,值为1表示语法出错(2)第2~3位为参考级别(3)第4~8为是nal单元类型

例如上面00000001后有67,68以及65

其中0x67的二进制码为:0110 01114-8为00111,转为十进制7,参考第二幅图:7对应序列参数集SPS

其中0x68的二进制码为:0110 10004-8为01000,转为十进制8,参考第二幅图:8对应图像参数集PPS

其中0x65的二进制码为:0110 01014-8为00101,转为十进制5,参考第二幅图:5对应IDR图像中的片(I帧)

 

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

比如0x65 & 31 = 5