最近在研究FLV视频格式,发现要想把H264码流解出来,就需要AVCDecoderConfigurationRecord 的信息,具体AVCDecoderConfigurationRecord 如何解析,可以参考:h264中avc和flv数据的解析
为了保证播放器可以正常解析数据出来,我们在打包数据格式无论是FLV还是MP4都必须提供AVCDecoderConfigurationRecord (里面包含里SPS序列参数集、PPS图片参数集,profie_idc,level_idc等信息),详细自己可以参考:ISO 14496-15 5.2.4.1.1.
下面我们通过WinHex打开H264编码器直接输出的码流数据VBITS_HDR_0.bin,如下图:
帧数据是将多个 NALU 使用 00 00 01或者00 00 00 01 连接的字节数组,看上面的数据时以00 00 00 01将一个一个NALU单元连接起来输出,
看上图,可以得到,注意看灰色的部分,NALU单元是以00 00 00 01分割的
这里插入一点NALU的小知识,每个NALU第一个字节的前5位标明的是该NAL包的类型,即NAL nal_unit_type
#define NALU_TYPE_SLICE 1
#define NALU_TYPE_DPA 2
#define NALU_TYPE_DPB 3
#define NALU_TYPE_DPC 4
#define NALU_TYPE_IDR 5
#define NALU_TYPE_SEI 6
#define NALU_TYPE_SPS 7
#define NALU_TYPE_PPS 8
#define NALU_TYPE_AUD 9 //访问分隔符
#define NALU_TYPE_EOSEQ 10
#define NALU_TYPE_EOSTREAM 11
#define NALU_TYPE_FILL 12
第一个NALU单元是sps,因为第一个字节 0x27&0x1f = 7
第二个PPS,因为0x28 & 0x1f = 8
第三个是SEI,因为 0x6 & 0x1f = 6
第四个是IDR,即关键帧,因为 0x25 & 0x1f = 5
H264参数语法文档: SPS、PPS、IDR http://blog.csdn.net/heanyu/article/details/6205390
也可以参考毕厚杰的书。