接触过H.264视频编解码的朋友应该都知道NAL 单元这个概念。NAL的全称是 (Network Abstraction Layer) 网络抽象层。而这个NAL的主要作用是方便视频编码后数据的存储和网络传输而设计的一个额外的层。也就是说NAL是对编码数据的一种封装。说到这我们就有必要先来聊一下H.264的编码输出数据的定义了。
H.264 将最后呈现给我们的编码数据分为两层:
VCL: (Video Coding Layer) 视频编码层。即视频图像编码后输出的裸数据。不包含其他额外信息的纯视频图像编码后数据。
NAL: (Network Abstraction Layer) 网络抽象层。即对编码输出的VCL数据进行一次封装得到NAL Uint。
好,那么我们了解了这两个概念之后,我们就知道了。我们看到的H.264 码流其实就是一个各NAL Uint连接起来的序列。那我们就先来看一看 NAL Uint sequence的结构吧
大家一看可能会觉得奇怪。刚刚说的是VCL 和NAL 现在呢,这个图里面就完全没有 VCL呀。结果出来了一个 RBSP。那么RBSP是什么呢,它的全称是 (Raw Byte Sequence Payload)原始字节序列负载。
RBSP其实就是对视频编码数据进行对齐处理后的数据了。即在编码器输出数据后面添加一个 bit 的 ‘1’或者几个bit 的‘0’进而达到字节对齐的结果。
回过来说NAL Uint,那NAL Uint就是 NAL头 + BRSP 咯。
那么我们就来看看NAL Uint吧。NAL Uint的语法