如何检查H264 / AVC ISO / IEC 14496-15 AVCDecoderConfigurationRecord?

时间:2012-06-23 19:55:23

标签: flash h.264 codec wowza

一些历史背景:我目前正在与Wowza合作并尝试解码来自 IMediaStream AMFPackets 。视频数据包将具有5字节标头,第一个数据包是编解码器配置。

到目前为止,在我的检查中,编解码器配置与 ISO / IEC 14496-15 AVCDecoderConfigurationRecord 布局相匹配。但是,我无法解码 SPS PPS 单位。

编解码器配置包,包括5字节头:

  

17 00 00 00 00 01 4D 00 15 03 01 00 2F 67 4D 40 15 96 52 02 83 F6 02   A1 00 00 03 00 01 00 00 03 00 28 E0 60 03 0D 40 00 49 3E 7F 18 E3 03   00 18 6A 00 02 49 F3 F8 C7 0E D0 B1 68 90 01 00 04 68 EB 73 52

Flash / Wowza特有的首先是标题:

  

17 00 00 00 00

  • 17 = 10111 = H.264 K帧
  • 00 = 0 =编解码器配置包
  • 000000 = 0 =开始时间0

接下来是AVCDecoderConfigurationRecord(十六进制=十进制):

  • configurationVersion:01 = 1
  • AVCProfileIndication:4D = 77(Main)
  • profile_compatibility:00 = 0
  • AVCLevelIndication:15 = 21(2.1)
  • 保留6位+ lengthSizeMinusOne:03 = 00000011 = 3(4字节)
  • 保留3位+ numOfSequenceParameterSets:01 = 0001 = 1
  • sequenceParameterSetLength:002F =(47 bytes)
  • (SPS记录长47字节)
  • numOfPictureParameterSets:01 = 1
  • pictureParameterSetLength:0004 =(4字节)
  • (PPS记录长4个字节)
  • (结束)

SPS记录(47字节):

  

67 4D 40 15 96 52 02 83 F6 02 A1 00 00 03 00 01 00 00 03 00 28 E0 60   03 0D 40 00 49 3E 7F 18 E3 03 00 18 6A 00 02 49 F3 F8 C7 0E D0 B1 68   90

假设这是一个包含SPS类型的NAL单元: (使用 ITU-T H.264 06/2011 7.3.1 NAL单元语法

  • 第一个字节:67 = 1100111
  • forbidden_​​zero_bit:1(哎呀,禁止0位设置为1?)
  • nal_ref_idc:2
  • nal_unit_type:0111 = 7(SPS)

假设SPS有效负载遵循: (使用 ITU-T H.264 06/2011 7.3.2.1.1序列参数集数据语法

  • profile_idc:4D = 77(主要,匹配)
  • 约束+ 2位保留(等于0):40 = 1000000(看起来很好)
  • level_idc:15(2.1,匹配)

假设这只是一个SPS: (使用 ITU-T H.264 06/2011 7.3.2.1.1序列参数集数据语法

  • profile_idc:67 = 103(我认为这应该像AVCProfileIndication一样77?)
  • 约束+ 2位保留(等于0):4D = 1001101(呃哦,保留位设置?)
  • level_idc:77(这不应该像AVCLevelIndication那样是21吗?)

看起来它是以前的NAL单元标头+ SPS记录,我怀疑这是不好的数据,因为每个捕获的配置数据包是相同的,但是什么让我失望是为什么被禁止的0位设置为1?

由于

1 个答案:

答案 0 :(得分:4)

我发现了问题......过于盯着1和0,你会错过一个(双关语)。

  

67 4D 40 15 ...

     

假设这是一个包含SPS类型的NAL单元:(使用ITU-T H.264 06/2011 7.3.1 NAL单元语法)

     

第一个字节:67 = 1100111

这是错误的,因为 1100111 只有7位。我使用MS计算器进行了转换,并且它去掉了前导0.正确的二进制文件是 01100111 ,并且有禁止的零位。

感谢那些试图解决这个问题的人。