H264码流的NAL起始字节分析

来源:互联网 发布:橙树网络 编辑:程序博客网 时间:2024/05/22 01:52

http://blog.sina.com.cn/s/blog_5f435c1301015oxp.html


这是一段H264码流,00 00 00 01这是对应forbidden_zero_bit的f(1),接着后面的nal_ref_idc的u(2),这个怎么解呀,有点晕。刚接触不久,nal_unit_type的u(5),后面的profile_idc的u(8)指的是那几个,是多少?

问题补充:

nal_ref_idc的u(2)对应67变成前两位0 1也就是1,nal_unit_type取64接着的5位 10 01 1则组合成19 ,profile_idc的u(8)则是后面的64转化为十进制则是100,level_idc则是0D是13,seq_parameter_set_id的ue(v),则指到AC了,这是哥伦布编码,答案是0,这个是怎么算出来的?
H264码流的NAL起始字节分析

2010-9-17 18:01

满意回答

00 00 00 01是Start code后面的ox67为 0110 0111

forbidden_zero_bit 是禁止位,应该是第一位即f(1)=0,1为语法有错误

nal_ref_idc是参考级别,代表被其它帧参考情况,u(2)= 11 = 3最(0为无参考,详见规范)

nal_unit_type是该帧的类型,为剩下的5位,u(5)= 0 0111 = 7

目前类型有:

//H264定义的类型 values for nal_unit_type

typedef enum {

 NALU_TYPE_SLICE    = 1,

 NALU_TYPE_DPA      = 2,

 NALU_TYPE_DPB      = 3,

 NALU_TYPE_DPC      = 4,

 NALU_TYPE_IDR      = 5,

 NALU_TYPE_SEI      = 6,

 NALU_TYPE_SPS      = 7,

 NALU_TYPE_PPS      = 8,

 NALU_TYPE_AUD      = 9,

 NALU_TYPE_EOSEQ    = 10,

 NALU_TYPE_EOSTREAM = 11,

 NALU_TYPE_FILL     = 12,

#if (MVC_EXTENSION_ENABLE)

 NALU_TYPE_PREFIX   = 14,

 NALU_TYPE_SUB_SPS  = 15,

 NALU_TYPE_SLC_EXT  = 20,

 NALU_TYPE_VDRD     = 24  // View and Dependency Representation Delimiter NAL Unit

#endif

} NaluType;

可以看出是NALU_TYPE_SPS  即sequence parameter sets

 

profile_idc的u(8)则是后面的64转化为十进制则是100,

66 Baseline

77 Main

88 Extended

100 High (FRExt)

110 High 10 (FRExt)

122 High 4:2:2 (FRExt)

144 High 4:4:4 (FRExt)

 

100是High (FRExt)

 

“level_idc则是0D是13,seq_parameter_set_id的ue(v),则指到AC了,这是哥伦布编码,答案是0,这个是怎么算出来的?“

就不太懂了。互相帮忙吧。

赞同

8

| 评论(1)

向TA求助

回答者: sindana 四级

擅长领域: 暂未定制

参加的活动: 暂时没有参加的活动

提问者对于答案的评价:

还是蛮感谢的,挺详细的!

以上内容来自链接 http://zhidao.baidu.com/question/184301276.html
最近在学习的h264视频流的以.flv文件格式存盘。在收到h264码流的每个NAL数据(Buffer指针)时,对于如下代码的理解: 
if((*(Buffer) == 0) && (*(Buffer+1) == 0) && (*(Buffer+2) == 0) && (*(Buffer+3) == 1)) 
//NAL头的0x00 00 00 01起始码    if(*(Buffer+4) == SPS_FRAME)   
//ox67为 0110 0111(nal_unit_type为低5位,u(5)= 0 0111 = 7)    frame_type = SPS_FRAME;     else if(*(Buffer+4) == PPS_FRAME)   
 //ox68为 0110 1000 (nal_unit_type为低5位,u(5)= 0 1000 = 8)    frame_type = PPS_FRAME;     else if(*(Buffer+4) == I_FRAME)   //ox65 0110 0101 nal_unit_type为低5位,u(5)= 0 0101 = 5    frame_type = I_FRAME;     else   //0x41为0100 00001 (nal_ref_idc是参考级别,代表被其它帧参考情况,u(2)= 10 = 2; nal_unit_type为低5位,u(5)= 0 0001 = 1)    frame_type = P_FRAME;     if((*(Buffer+5) & 0x80) == 0x80)      start_frame = 1;    }