参考:https://www.it610.com/article/1297657355793670144.htm
https://blog.csdn.net/freeyond/article/details/77918253
1、H264的结构图
2、H264的编码分层
H.264原始码流(裸流)是由一个接一个NALU组成,它的功能分为两层,VCL(视频编码层)和 NAL(网络提取层).
(1)NAL层 (视频数据网络抽象层)
因为H264最终还是要在网络上进行传输,在传输的时候,网络包的最大传输单元是1500字节,一个H264的帧往往是大于1500字节的,所以需要将一个帧拆成多个包进行传输。这些拆包、组包等工作都在NAL层去处理。VCL数据要在网络上传输或者存储到磁盘上之前,需要先被封装或映射进NAL单元(NALU)中,每个NAL单元之前需要添加StartCodePrefix,最后形成H.264码流。
(2)VCL层 (视频编码层)
对视频的原始数据进行压缩。VCL数据编码器直接输出的原始数据比特串(SODB),它表示图像被压缩后的编码比特流。
分层图及基本概念
SODB:原始数据比特串(String Of Data Bit)。由编码器直接输出的原始编码数据,即VCL数据。
RBSP:原始字节序列载荷(Raw Byte Sequence Payload)。在SODB的后面增加了若干结尾比特(RBSP trailing bits,1个为’1’的bit和若干为’0’的bit),以使SODB长度为整数字节。
EBSP:扩展字节序列载荷(Extension Byte Sequence Payload)。在RBSP的基础上增加了仿校验字节(0x03)。 增加仿校验字节原因是:将NALU添加到H.264码流上时,需要在每个NALU之前添加开始码(StartCodePrefix)。 添加StartCodePrefix的规则为:如果该NALU对应的slice为一帧的开始则StartCodePrefix为“0x00 0x00 0x00 0x01”这4个字节;否则StartCodePrefix为“0x00 0x00 0x01”这3个字节 。同时H264规定,当检测到0x000000时,也可以表示当前NALU的结束。为了使NALU主体中不包含与开始码相冲突的字节序列,在编码时,每遇到两个字节连续为0x00,就在这两个字节后面插入一个字节的0x03。解码时将0x03去掉,称为脱壳操作。 如下面的图3.3,就是一帧的EBSP数据。
NALU:NAL单元(NAL Unit&#x