本文简单介绍一下H264协议内容,都是项目中具体使用的,太详细的不必介绍了,需要详读协议。

首先需要明确H264可以分为两层:

1.VCL  video codinglayer       视频编码层

2.NAL  network abstraction layer  网络提取层

对于VCL具体的编解码算法这里就不介绍了,只介绍常用的NAL层,即网络提取层,在demux的时候常用。这里面包含了该视频的一些metadata详细信息,是解码的基础。

首先每一帧的NAL单元的区分有两种方式:

1.通过字节区分,前四个字节为size,后面紧跟数据,以此类推,过完size数后的四个字节是下一个NAL单元的size,后面紧跟数据。

2.通过特殊字符确认,00 00 01(一般情况)或者00 00 00 01(NAL单元是一帧的开始)来区分NAL单元。

官方文档解析NAL单元的表格如下:

H264协议简介-编程知识网

比如一帧的开始是00 00 00 01 67,那么00 00 00 01作为区分NAL单元的一个区分位,可以去掉。正式的NAL type是后面的67(16进制),二进制为:0110 0111 

其中第一位是:Forbidden_zero_bit=0;

之后两位是:Nal_ref_idc:表示NAL的优先级。0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

后五位是:Nal_unit_type:当前NAL 单元的类型,参照上面表格中来确认类型。其中6和7比较重要,也就是所谓的PPS,SPS,包含了详细的metadata信息,是解码的基础。