H264为了进一步增加压缩率引入了熵编码模式,这就导致了很多时候无法从码流上直接按比特位读取到有效信息,所以必须要了解熵编码的原理才能帮助我们进行一些初步的码流阅读
以一个sps码流为例,如何对它进行解读
我们需要用到H264官方提供的句法表,了解这段码流的组织形式,下图是NAL层和sps的RBSP的句法组织形式,我们必须按照这个组织形式才能正确的阅读这段码流
这里的关键在于表格最右出现的描述符
描述符其中有f(v),u(v),ue(v)等等
它的意思是告诉我们左边这个字段具体应该是怎么解析的
可以用一张表格来总结所有出现的描述符
描述符 | 含义 |
f(n) | n位固定bit串,左位在前 |
b(8) | 8位固定bit串,仅用于表示rbsp |
u(n) | n位固定无符号整数 |
i(n) | n位固定有符号整数 |
ue(v) | 无符号指数哥伦布编码 |
se(v) | 有符号指数哥伦布编码 |
te(v) | 舍位指数哥伦布编码 |
me(v) | 映射指数哥伦布编码 |
ce(v) | 上下文自适应的变长编码 |
ae(v) | 上下文自适应的二进制算术编码 |
这里的指数哥伦布编码的具体编码方式和上下文自适应的编码方式另开文章介绍
那么这个码流的阅读就简单多了
其中00 00 00 01是起始码
根据NALU的句法
forbidden_zero_bit 是f(1), 就是读一个bit
即将0x67展开成二进制? 0110 0111
读一个bit即是forbidden_zero_bit = 0
nal_ref_idc为u(2), 意思是读2个bit位,标识成一个无符号整数
则在 0[11]0 0111 继续读2个bit ,nal_ref_idc= [11] = 3
nal_unit_type 为u(5)就类似继续读5bit, [00111]
所以nal_unit_type = 7, 意思就是这个NAL是sps