作为一名向进军流媒体行业的工程师,学习H264太过于枯燥一时间理解不了H264的算法概念什么的就先从解析H264的源数据开始吧。
1.文件结构
H264的源文件是由NAL单元组成,一个完整的NAL数据由起始码前缀,NAL头和RBSP三部分组成。
起始码前缀为:0X00 0X00 0X00 0X01四个连续的字符组成。
NAL头由一个字节组成:
bit[7]固定为0即必须为0 表示:forbidden_zero_bit
bit[6:5]:表示:nal_ref_idc
bit[4:0]:表示NAL单元的类型,nal_unit_type
剩余的部分就是整个文件的主题部分RBSP
2.准备工作
在这里需要重要的提一下分析H264文件数据的时候一般是以bit 流的形式去分析数据除了常见的整形数据类型还有哥伦比亚指数编码。还有就是需要将NAL单元的除起始码前缀和NAL头部分的数据转换为RBSP形式。
2.1哥伦比亚指数编码解析
2.1.1哥伦比亚指数编码无符号数的解码
(1)首先读取当前位置的bit位,记录连续0的个数N
(2)对于连续0的个数为0值为0,对于连续0的个数不为0 跳过第一个非0的bit位
(3)再读取N个数据,此数据以无符号形式解析num
(4)num=num-1+2的N次方
2.1.2哥伦比亚指数编码有符号数的解码
(1)按照2.1.1的讲述先获取此段数据的哥伦比亚指数编码的无符号形式
(2)如果数据为奇数num=(num+1)/2;如果是偶数num=-(num/2)
2.2将NAL数据转换为RBSP数据
其实这个部分需要做的就是将NAL单元除头部的数据剔除连续两个0x00数据后面的0x03数据。
3.手动解析
当前获取的源数据为:
00 00 00 01 67 64 00 0C
AC D9 41 41 FB 01 10 00
00 03 00 10 00 00 03 01
E0 F1 42 99 60
NAL头部的数据为0x67(0110 0111)所以forbidden_zero_bit(0)的值为0,nal_ref_idc(11)的值为(3),nal_unit_type(00111)的值为7表示后面的RBSP数据为参数序列集
将后面的数据转换为RBSP格式的数据为:
64 00 0C