H264包解析

在H.264/AVC标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。

VCL负责表示视频数据的内容,NAL则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。

在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元中。

NAL单元是NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷的字节流(RBSP)。

H264码流结构图:



起始码:如果NALU对应的slice为一帧的开始,NAL则用4字节表示,即0x00 00 00 01,负责用3字节表示:0x00 00 01。

NAL Header:forbidden_bit,nal_reference_bit(优先级),nal_unit_type(类型)。

脱壳操作:为了使NALU主体不包括起始码,在编码时每遇到两个字节(连续)的0,就插入一字节0x03,以和起始码区别。


NAL单元解码流程:


流程为:首先从NAL单元中提取出RBSP结构流,然后根据NALU类型处理RBSP数据。

从h264原文件中分离出NAL数据,用c代码的一种实现方式:

int FindStartCode (unsigned char *Buf, int zeros_in_startcode)
{
  int info;
  int i;

  info = 1;
  for (i = 0; i < zeros_in_startcode; i++)
    if(Buf[i] != 0)
      info = 0;

  if(Buf[i] != 1)
    info = 0;
  return info;
}

int getNextNal(FILE* inpf, unsigned char* Buf)//打开的文件句柄,和将读取的字节存储到Buf中
{
	int pos = 0;
	int StartCodeFound = 0;
	int info2 = 0;
	int info3 = 0;
	int i = 0;
	while (!feof(inpf) && (Buf[pos++] = fgetc(inpf)) == 0);//跳过NAL头

<span style="white-space:pre">	</span>/*通过查找下一次的NAL头来计算本次的NAL的长度,根据长度来读取NAL数据包*/
	while (!StartCodeFound)
	{
		if (feof (inpf))
		{
			return pos-1;
		}
		Buf[pos++] = fgetc (inpf);
		printf("%02X\n", Buf[pos - 1]);
		info3 = FindStartCode(&Buf[pos-4], 3);
		if(info3 != 1)
			info2 = FindStartCode(&Buf[pos-3], 2);
		StartCodeFound = (info2 == 1 || info3 == 1);
	}
	fseek (inpf, -4, SEEK_CUR);
	return pos - 4;//返回的就是一个NAL的长度
}

得到NAL就可以去做相应的解码处理了。X264提供的仅是对于h264的编码操作,FFMPEG有解码的实现,具体的请看我的另一篇博文,

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值