ASF文件中实际的媒体数据遵循Payload Parsing Information。一个packet可以包含一个或者多个payload数据,这依赖于Payload Parsing Information中的Multiple Payloads Present标记。如果Multiple Payloads Present设置为1,这个packet就由多个payload组成。有四种payload:
(1)Single Payload
(2)Single Payload,Compressed Payload Data
(3)Multiple Payload
(4)Multiple Payload,Compressed Payload Data
在实际的解析过程中如何判断是使用了那种类型的payload呢?
首先,通过Multiple Payloads Present判断是Single Payload类型还是Multiple Payload类型。
然后,根据Replicated Data Lengt判断是否为Compressed Payload Data。
1、Single Payload
在Packet中仅仅有一个payload,其结构如图1所示。
图1 Single Payload结构
2、Single Payload,Compressed Payload Data
这种payload类型也是一种Single Payload类型,只是它的payload是压缩的,即compressed payload包含一个或者多个sub-payloads。该种payload的结构如图2所示。
图2 Single Payload,Compressed Payload结构
3、Multiple Payload
这种类型在Packet中有多个payload,其结构如图3所示。
图3 Multiple Payload结构
Payloads这个field包含了一个数组,每个数组元素都是一个payload,其个数由Number of Payloads指定。payload的结构如图4所示。
图4 Multiple Payload中payload的结构
4、Multiple Payload,Compressed Payload Data
这种类型在Packet中有多个payload,而且每个payload都是compressed payload,即每个payload包含一个或者多个sub payload。每个sub payload都是一个独立的payload。Multiple Payload,Compressed Payload结构如图5所示。
图5 Multiple Payload,Compressed Payload结构
Compressed Payloads包含了一个数组,每个数组元素都是一个compressed payload,其结构与Single Payload,Compressed Payload中的payload的结构类似,如图6所示。
图6 Compressed Payloads中payload的结构
5、Payload中各field的含义
(1)Number of Payloads
Multiple Payload包含多个payload,因此,Number of Payloads就是用来指定packet中包含的payload的个数。
(2)Payload Length Type
这个field用来定义该packet中的每个payload的Payload Length这个field的类型,定义如下
01:BYTE
10:WORD
11:DWORD
(3)Stream Number
Stream Number指定了两个方面的内容,该payload所在的stream的number,以及是否为key frame。Stream Number的结构组成如图7所示。
图7 Stream Number的结构组成
(4)Media Object Number
如果不是compressed payload,指定了该payload所在的media object的number。如果是compressed payload,则指定的是第一个sub payload所在的media object的number,且每个sub payload的media object number = Media Object Number + sub payload number。需要注意的是,如果payload parsing information的Media Object Number Length Type是00,则Media Object Number不会出现。
(5)Presentation Time
Presentation Time只出现在compressed payload中,指定了第一个sub payload所在的media object的显示时间。这个field必须出现的,因此,payload parsing information的Offset Into Media Object Length Type不能设置为00。
(6)Offset Into Media Object
Offset Into Media Object只出现在非compressed payload中,指定了payload所在的media object的偏移量。如果payload parsing information的Offset Into Media Object Length Type设置为00,则Offset Into Media Object不应该出现。
(7)Replicated Data Length
Replicated Data Length指定了Replicated Data的大小,这个field必须出现,因此,payload parsing information的Replicated Data Length Type不能设置为00。这个field可以用来判断该payload是否是compressed payload。
(8)Replicated Data
Replicated Data field指定了一个包含Replicated Data的数组,其大小由Replicated Data Length指定。对于同一个Media Object的所有payload,Replicated Data是一样的。
(9)Presentation Time Delta
Presentation Time Delta只出现在compressed payload中,指定了显示时间差值,该值被应用到除了第一个sub payload之外的其他所有的sub payload。
sub payload的显示时间 = Presentation Time + Presentation Time Delta。
(10)Sub-Payload Data
Sub-Payload Data指定了一个包含sub payload的数组。Sub-Payload Data field的结构如图8所示。每一个sub payload都是一个独立的payload。
图8 Sub-Payload Data field的结构