一些历史背景:我目前正在使用 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 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?
谢谢