- 编码器编码出的H264码流格式默认为字节流AnnexB格式,如下图所示每一个NALU单元前都有一个起始码,起始码对于一帧的首个NALU为0x00 00 00 01,其余的为0x 00 00 01。
- image.png
2.一个NALU单元,其由NALU Header 和EBSP组成。NALU Header占位1Byte
SODB:数据比特串,h264最原始的编码数据
RBSP: 原始字节序列载荷,在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐。
image.png image.pngEBSP 扩展字节序列载荷,在RBSP基础上填加了仿校验字节(0X03)它的原因是: 在NALU加到Annexb上时,需要添加每组NALU之前的开始码 StartCode,如果该NALU对应的slice为一帧的开始则用4位字节表示,0x00000001,否则用3位字节表示 0x000001.为了使NALU主体中不包括与开始码相冲突的数据,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。 也称为脱壳操作。
- NALU Header说明
字段名 | 字段大小 | 字段说明 |
---|---|---|
forbidden_bit | 1bit | 如果有语法冲突,则为 1。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元 |
nal_reference_bit | 2bit | 用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有具体规定。 |
nal_unit_type | 5bit | image.png |
- 常用nalu_type:
NALU类型 | 重要程度 | nalu_type |
---|---|---|
0x67 (0 11 00111) SPS | 非常重要 | type = 7 |
0x68 (0 11 01000) PPS | 非常重要 | type = 8 |
0x65 (0 11 00101) IDR帧 关键帧 | 非常重要 | type = 5 |
0x61 (0 11 00001) I帧 | 重要 | type=1 非IDR的I帧不大常见 |
0x41 (0 10 00001) P帧 | 重要 | type = 1 |
0x01 (0 00 00001) B帧 | 不重要 | type = 1 |
0x06 (0 00 00110) SEI | 不重要 | type = 6 |
从前面的分析我们知道,VCL层出来的是编码完的视频帧数据,这些帧可能是I、B、P帧,而且这些帧可能属于不同的序列,再者同一个序列还有相对应的一套序列参数集和图片参数集等等,所以要完成视频的解码,不仅需要传输VCL层编码出来的视频帧数据,还需要传输序列参数集、图像参数集等数据。
参数集:包括序列参数集 SPS 和图像参数集 PPS
- SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。
- PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。
网友评论