在上一篇文章 H.264 NALUint解析中对NALUint进行了语法结构上的分析了。这篇文章将对照上一篇的分析,结合实际的例子来一次实际的分析。
我现在用UltraEdit打开一个.h264文件
看到如下结果
我们看到头四个字节的内容:
0x00 00 00 01
这就是NALUint的起始码,一直到遇到下一个起始码。我们一路看下去发下,下一个起始码出现在 0x0000001C这个地址。
所以我们的第一个NALUint就是
我们解析它的第一个字节的NALU header。我们对照着NALU Header的结构定义。
0x67展开成二进制格式是 ‘0110 0111’b。所以三个字段的值分别如下
forbidden_zero_bit == 0
nal_ref_idc == 3
nal_unit_type == 7
根据nal_unit_type的值是7我们可以知道这是一个 Sps(Sequence parameter set)序列参数集
再之后又是一个NALUint
根据第一个字节的NALUint header的值 0x68可知。
nal_ref_idc == 3
nal_unit_type == 8
其对应的NALUint 为Pps (Picture parameter set) 图像参数集
再后面是起始码为 0x000001的一个NALUint
这个NALUint比较长,它的nal_unit_type == 6。是一个SEI (补充增强信息单元)。
再后面又发现一个起始码
从NALU Header的内容 0x65我们可以知道,这个NALU的
nal_ref_idc == 3
nal_uint_type == 5 (IDR 帧)
好了,实例分析就分析到这里,起始总结下来就是找起始码。两个起始码之间的内容就是一个完整的NALUint的内容。然后取NALUint第一个字节的内容就是NALUint Header。算出nal_unit_type的值,我们就会知道这个NALUint属于哪种帧,或者是sps,pps 或其他一下非VCL NALU。