ASF文件结构之Packet的Payload

时间:2023-01-22 23:54:13

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所示。

ASF文件结构之Packet的Payload

图1 Single Payload结构

2、Single Payload,Compressed Payload Data

这种payload类型也是一种Single Payload类型,只是它的payload是压缩的,即compressed payload包含一个或者多个sub-payloads。该种payload的结构如图2所示。

ASF文件结构之Packet的Payload

图2 Single Payload,Compressed Payload结构

3、Multiple Payload

这种类型在Packet中有多个payload,其结构如图3所示。

ASF文件结构之Packet的Payload

图3 Multiple Payload结构

Payloads这个field包含了一个数组,每个数组元素都是一个payload,其个数由Number of Payloads指定。payload的结构如图4所示。

ASF文件结构之Packet的Payload

图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所示。

ASF文件结构之Packet的Payload

图5 Multiple Payload,Compressed Payload结构

Compressed Payloads包含了一个数组,每个数组元素都是一个compressed payload,其结构与Single Payload,Compressed Payload中的payload的结构类似,如图6所示。

ASF文件结构之Packet的Payload

图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所示。
ASF文件结构之Packet的Payload

图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。
ASF文件结构之Packet的Payload

图8 Sub-Payload Data field的结构