10

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

到目前为止,在我检查编解码器配置时,它与ISO/IEC 14496-15 AVCDecoderConfigurationRecord布局相匹配。但是,我在解码SPSPPS单元时遇到了问题。

包含 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 16 00 49 3E 0 1 8 A 403 3E 7 F 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(十六进制 = 十进制):

  • 配置版本:01 = 1
  • AVCProfileIndication:4D = 77(主要)
  • profile_compatibility: 00 = 0
  • AVCLevelIndication:15 = 21 (2.1)
  • 6 位保留 + lengthSizeMinusOne:03 = 00000011 = 3(4 字节)
  • 3 位保留 + numOfSequenceParameterSets:01 = 0001 = 1
  • 序列参数集长度:002F =(47 字节)
  • (SPS 记录 47 字节长)
  • numOfPictureParameterSets:01 = 1
  • 图片参数集长度: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

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

  • 第一个字节:67 = 1100111
  • 禁止零位: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?

谢谢

4

1 回答 1

4

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

67 4D 40 15...

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

第一个字节:67 = 1100111

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

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

于 2012-06-25T08:17:58.167 回答