转自http://blog.csdn.net/leixiaohua1020/article/details/50534369
转自http://blog.csdn.net/leixiaohua1020/article/details/50534369
1、原理
2、代码
下面是定义两个枚举:一个是NALU的类型,一个是NALU的极性
定义一个NALU的结构,其成员定义如下
startcodeprefix_len:开始码StartCodePrefix的长度,4个表示图片的首片,3个表示其他。
len:NAL单元的长度(排除起始码(不属于NALU))
max_size:nal单元缓冲区大小
nal_reference_bit是NALU的极性
nal_uint_type是NALU的类型
buf:指向EBSP后的第一个字节,也就是NAL单元的首部
找起始代码2这个函数,其中buf是指向起始码的指针,也就是说先判断第一和第二个字节是否为0,第三个字节是否为1,也就是0x000001这个值
找起始代码3这个函数,其中buf是指向起始码的指针,也就是说先判断第一和第二个和第三个字节是否为0,第四个字节是否为1,也就是0x00000001这个值
从而判断NALU对应的Slice(片)是否为一帧的开始
GetAnnexNALU函数分析
(1)传入的参数是NALU_t结构体指针nalu,先分配一个max_size个长度为char的空
间。如果开始码长度初始化为3,吧h264字节流的前3个字节读到buf中,如果存在,判
断是0x000001还是0x00000001。如果这三个字节的最后一个字节不为1,如果第4个
字节也不为1,那就释放buf。否则开始码的长度为4,pos=4。如果info2等于1,也就是
为0x000001,所以开始码的长度为3,pos=3。发现开始码标志为0,然后循环读取位
流,存到以pos为下标的buf数组中,
上部分程序的解析
nalu的长度是pos的最终位置减1后再减去起始码的长度。开始把起始码后的大小为len的内容拷贝到nalu的buf中。开始检查起始码后的第一个字节的位判断参考http://blog.csdn.net/qingkongyeyue/article/details/52862654
依次寻找下一个起始码,如果找到退出循环,并进入下一个NALU的操作
h264bitstrem指针指向h264位流文件;分配NALU_t结构体的大小,n为指向分配到的空间的指针;buffersize是(max_size:nal单元缓冲区大小),大小为100000;
buf:指向EBSP后的第一个字节,也就是NAL单元的首部;打印出显示信息的首部,循环读取h264字节流,
得到h264位流的长度,先判断NALU的类型,再判断极性位。nal的编号,数据偏移值,NALU的类型,极性位,nalu的长度