ASF文件的组织单元是ASF Object,object的结构如图1所示,有一个128位的GUID、64位的object size和一个可变长度的object组成。其中,object size的值满足下面的公式:
Object Size = 16 + 8 + size of object data。
图1 ASF Object结构
所有的ASF Object和Structure都是以little-endian的顺序保存的。不过,data packet中的数据,既可以以little-endian的顺序保存,也可以以big-endian的顺序保存的。ASF文件在逻辑上由三类top-level object组成:Header Object、Data Object和Index Object。
(1)Header Object是强制的且必须放在文件的开始位置。
(2)Data Object也必须是强制的且必须放在Header Object的后面。
(3)Index Object是可选的,可有可无,但是对于基于时间的随机访问操作是非常有用的。Index Object如果出现,必须放在文件的最后位置。
ASF的Top-Level文件结构如图2所示。
图2 ASF的Top-Level文件结构
1、Header Object
Header Object的作用是在ASF文件的开始位置提供一个字节序列和包含一些有用的信息,这些信息可以用来正确的描述data object中的信息。Header Object可以选择性的包含一些metadata,比如文献目录信息。
Header Object是这三种Top-Level Object中唯一的一个可以包含其他的ASF objects。Header Object可以包含如下的标准objects,而且他们的保存顺序可以是任意的。
(1)File Properties Object:包含了全局的文件属性。
(2)Stream Properties Object:定义了一个媒体流和它的相关特性。
(3)Header Extension Object:在保证向后兼容的情况下,允许想ASF文件添加附加的功能。
(4)Content Description Object:包含文献目录信息。
(5)Script Command Object:包含了在播放工程中可以被执行的命令。
(6)Marker Object:提供了被命名的在文件内部的跳跃点。
为了使文件能够正常播放,Header Object必须包含一个File Properties Object、一个File Properties Object和至少一个Stream Properties Object。
2、Data Object
Data Object包含了所有的媒体数据,这些数据以Data Packet的形式保存。每个Data Packet可以包含一个或者多个媒体流的数据。这些Data Packet在传输的时候基于时间进行
分类,这种分类也导致了交叉的数据格式。
交叉的packet定义提供了以下几种性能:
(1)每个Data Packet可以包含单个或多种payload类型;
(2)固定尺寸的Data Packet;
(3)错误纠正信息(可选);
(4)时钟信息(可选);
(5)冗余采样信息(可选)。
3、Index Object
有两种类型的Index Object:Simple Index Object和Index Object,其中Index Object还包括几种变种类型的index object。
(1)Simple Index Object:Simple Index Object包含了一个针对视频数据的基于时间的index,在相邻的index entry之间的时间间隔是恒定的,而且这个时间间隔值也会被保存在Simple Index Object中。对每个视频流,都应该定义一个Simple Index Object实体,而且这些实体出现的顺序也是非常重要的。这些实体的顺序应该和他们对应的视频流的编号的顺序是一致的。
(2)Index Object有两个变种类型的index object:Media Object Index Object和Timecode Index Object,他们的格式是相似的。Index Object和Simple Index Object类型,是基于时间的索引,而且具有固定的时间间隔,但不局限于视频流。Media Object Index Object是基于帧的索引,通过帧或者object number来便利seek操作。Timecode Index Object在包含timecode的内容中通过timecode来便利seek操作。