总体结构
h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)。H.264 的编码视频序列包括一系列的NAL 单元,每个NAL 单元包含一个RBSP。一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是"00 00 00 01" 或"00 00 01"。
NAL单元是有NAL Header 和NAL Payload组成
这里简单说下body的封装过程:总计三层
-
最内层的是SODB,也就是最原始的压缩数据,因为是压缩出来的,所以不一定是字节对齐的,所以需要做到字节对齐,对齐的方式是在最后未对齐的一个byte中,先插入一个1 其余的全部用0填充进行对齐
-
中间层是RBSP , SODB+ rbsp_trailing_bis()就构成了RBSP,也就是在经过补齐的SODB数据
-
最外层的是EBSP,其实就等同于是NAL Body,因为h264的标志位为0x 00 00 01 或 0x 00 00 00 01 ,万一我的RBSP中刚好就有这几个字符呢,比如说有 0x 00 00 01怎么办,所以如果遇到这种情况,规定会在0x 00 00 之后插入03 就变成了0x 00 00 03 01 ,消除威胁
详细语法学习
NAL单元语法
- forbidden_zero_bit 应为0,不为0时表示是坏帧。
- nal_ref_idc 不等于0 时,规定NAL 单元的内容包含一个序列参数集,或一个图像参数集,或一个参考图像
条带,或一个参考图像的条带数据分割。 - nal_unit_type: 表示nal type