ASF(Advanced Streaming Format)是微软公司针对real公司开发的新一代网上流式数字音频压缩技术,是Microsoft为Windows98所开发的串流多媒体文件格式,是包含音频、视频、图像以及控制命令脚本的数据格式。这种压缩技术的特点是同时兼顾了保真度和网络传输需求,可和WMA及WMV互换使用。
高级流格式是由微软公司在1995年至1998年。其主要目的是作为一个普遍的形式存储和流媒体。有两个版本的ASF。一个版本是ASF2.0,另一个版本的ASF1.0。这里介绍ASF1.0:
ASF 对象定义
ASF文件基本的组织单元叫做ASF 对象,它是由一个128位的全球唯一的对象标识符(Object ID),一个64位整数的对象大小(Object Size)和一个可变长的对象数据(Object Data)组成。对象大小域的值是由对象数据的大小加上24比特之和。
ASF对象
这个文件组织单元有点类似于RIFF(Resource Interchange File Format)字节片。RIFF字节片时AVI和WAV文件的基本单位。ASF对象在两个方面改进了RIFF的设计。首先,无需一个权威机构来管理对象标识符系统,因为计算机网卡能够产生一个有效的唯一的GUID。其次,对象大小字段已定义得足够处理高带宽多媒体内容的大文件。
高层文件结构
ASF文件逻辑上是由三个高层对象组成:头对象(Header Object)、数据对象(Data Object)和索引对象(Index Object).。头对象是必需的并且必须放在每一个ASF文件的开头部分,数据对象也是必需的,且一般情况下紧跟在头对象之后。索引对象是可选的,但是一般推荐使用。
高层ASF文件结构
在具体实现过程中可能会出现一些文件包含无序的(Out-Of-Order)的对象,ASF也支持,但在特定情况下,将导致ASF 文件不能使用,如从特定的文件源如HTTP服务器读取该类ASF文件。同样地,额外的高层对象也可能被运用并加入到ASF文件中。一般推荐这些另加的对象跟在索引对象之后。
ASF数据对象能够被解释的一个前提条件是头对象已被客户机接收到。ASF没有声明头对象信息是如何到达客户端的,"到达机制"是一个"本地实现问题",显然已超过了ASF 的定义范围。头对象先于数据对象到达有三种方式:
包含头对象的信息作为"会话声明"的一部分。
利用一个与数据对象不同的"通道"发送头对象。
在发送ASF 数据对象之前发送头对象。
ASF 头对象
在ASF的三个高层对象中,头对象是唯一包含其他ASF 对象的对象。头对象可能包含一下对象:
文件属性对象(File Properties Object)----全局文件属性。
流属性对象(Stream Properties Object)----定义一个媒体流和其属性。
内容描述对象(Content Description Object)----包含所有目录信息。
部件下载对象(Component Download Object)----提供播放部件信息。
流组织对象(Stream Groups Object)----逻辑上把多个媒体流组织在一起。
可伸缩对象(Scalable Object)----定义媒体流之间的可伸缩的关系。
优先级对象(Prioritization Object)----定义相关流的优先级。
相互排斥对象(Mutual Exclusion Object)----定义排斥关系如语言选择。
媒体相互依赖对象(Inter-Media Dependency Object)----定义混合媒体流之间的相互依赖关系。
级别对象(Rating Object)----根据W3C PICS定义文件的级别。
索引参数对象(Index Parameters Object)----提供必要的信息以重建ASF文件的索引。
ASF 头对象
头对象的作用是在ASF文件的开始部分提供一个众所周知的比特序列,并且包含所有其它头对象信息。头对象提供了存储在数据对象中的多媒体数据的全局的信息。
ASF数据对象
数据对象包含一个ASF 文件的所有多媒体数据。多媒体数据以ASF数据单元的形式存储,每一个ASF数据单元都是可变长的,且包含的数据必须是同一种媒体流。数据单元在当它们开始传输的时候在数据对象中自动地排序,这种排序来自于交叉存储的文件格式。
ASF索引对象
ASF索引对象包含一个嵌入ASF文件的多媒体数据的基于时间的索引。每以索引进入表现的时间间隔是在制作时设置的,并且存储在索引对象中。由于没有必要为一个文件的每一个媒体流建立一个索引,因此,通常利用一个时间间隔列表来索引一系列的媒体流。
数据类型
UINT8,UINT16,UINT32,UINT64-无符号整数的价值观,8,16,32或64位长。在GNUC编译器它们所代表的类型'unsigned char ’,'unsigned short ’,'unsigned long ’和'unsigned long long FILETIME-无符号的64位整数,100纳秒的倍数。
GUID的-128位的价值,可以产生在任何系统使用特殊的算法。该算法保证独特任何此类值(这意味着两个不同的计算机上,甚至在同一台计算机中不同时刻的时间不能产生相同的GUID)。
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
Value | Description |
---|---|
1 | 说明该位图是一个黑白的,bmiColors 成 员包含两个条目。 在该位图中,每一位代表一个像素。 如果该位为0, 则该像素用bmiColors 表中的第一个条目中的颜色进行显示。 如果该位为1, 则该像素用bmiColors 表 中的第二个条目中的颜色进行显示。 |
2 | 位图可以有4种 颜色值。 |
4 | 位图最大可以有16种 颜色,bmiColors 成员包含16个条目。 位图中的每一个像素,由颜色表中的一个4位的索引进行表示。 例如,如果位图中的第一个字节为 0x1F,该字节表示两个像素。第一个像素 包含表中的第二个条目的颜色,第二个像素包含表中第16个条目的颜色。 |
8 | 位图最大可以有256种颜色,bmiColors 成 员包含256个条目。在这种情况下,数组中的每一个字节标示一个像素。 |
16 | 位图最大可以有2^16 种颜色。 如果BITMAPINFOHEADER 结构体的biCompression 成员为BI_RGB ,则bmiColors 成员NULL 。 该位图中,每一个字代表一个像素。红色,绿色和蓝色的相 对强度,由每个颜色组件的5个位 来表示。 对应蓝色的值,在最低的5个位,其后是分别对应绿色和红色的各5位。 最高的一位没有使用。bmiColors 颜色表用于优化基于调色板设备的颜色,并且必须包含BITMAPINFOHEADER 结 构体的biClrUsed 成员指定的条目的个数。 |
24 | 位图最大可以有2^24 种颜色,并且bmiColors 成 员为NULL。 位图数组中的每三个字节,表示一个像素中蓝色,绿色和红 色的相对强度。 bmiColors 颜色表用于优化基于调色板设备的颜色,并且必须包含BITMAPINFOHEADER结构体的biClrUsed 成员指定的条目的个数。 |
32 | 位图最大可以有2^32 种颜色。如果结构 体BITMAPINFOHEADER 的成员biCompression为BI_RGB ,则成员bmiColors 为NULL。位图数组中的一个DWORD 代表一个像素中蓝色,绿色和红色的相对强度。DWORD 中的最高一个字节没有使用。bmiColors 颜色表用于优化基于调色板设备的颜色,并且必须包含BITMAPINFOHEADER 结 构体的biClrUsed成员指定的条目的个数。 如果结构体BITMAPINFOHEADER 的成员biCompression 为 BI_BITFIELDS,成员bmiColors 包含三个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色和蓝色。 位图数组中的一个DWORD 代表一个像 |
Value | Description |
---|---|
BI_RGB | 一个未压缩的格式。 |
BI_BITFIELDS | 指定该位图没有被压缩,并且颜色表中包含三 个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色和蓝色。 该值对16- 和 32-bpp 位 图有效。 该值对WinCE 2.0及以后版本有效。 |
BI_ALPHABITFIELDS | 指定该位图没有被压缩,并且颜色表中包含三 个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色,蓝色和alpha组件。 该值对16- 和 32-bpp 位 图有效。 该值对WinCE 4.0及以后版本有效。 |
typedef struct
{
WORD wFormatTag; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等;
WORD nChannels; //声道数,单声道为1,双声道为2;
DWORD nSamplesPerSec; //采样频率;
DWORD nAvgBytesPerSec; //每秒的数据量
WORD nBlockAlign; //块对齐标志
WORD wBitsPerSample; //WAVE文件的采样大小
WORD cbSize; //附加数据的大小,PCM中忽略此值
} WAVEFORMATEX;
基本信息
ASF1.0文件格式由'块’。他们是块类似的AVI格式,而且大小各自领域的增加。
块:
Field | Type | Size (bytes) |
Chunk type | GUID | 16 |
Chunk length | UINT64 | 8 |
Data | - | Variable |
Field | Type | Size (bytes) |
Chunk type | GUID | 16 |
Chunk length | UINT64 | 8 |
Number of subchunks | UINT32 | 4 |
Unknown | - | 2 |
Chunks | - | Variable |
Field | Type | Size (bytes) |
Chunk type | GUID | 16 |
Chunk length | UINT64 | 8 |
Client GUID | GUID | 16 |
File size | UINT64 | 8 |
File creation time | FILETIME | 8 |
Number of packets | UINT64 | 8 |
Timestamp of the end position | UINT64 | 8 |
Duration of the playback | UINT64 | 8 |
Timestamp of the start position | UINT32 | 4 |
Unknown, maybe reserved ( usually contains 0 ) | UINT32 | 4 |
Flags ( usually contains 2 ) | UINT32 | 4 |
Minimum size of packet, in bytes | UINT32 | 4 |
Maximum size of packet | UINT32 | 4 |
Size of uncompressed video frame | UINT32 | 4 |
Field | Type | Size (bytes) |
Chunk type | GUID | 16 |
Chunk length | UINT64 | 8 |
Stream type (audio/video) | GUID | 16 |
Audio error concealment type | GUID | 16 |
Unknown, maybe reserved ( usually contains 0 ) | UINT64 | 8 |
Total size of type-specific data | UINT32 | 4 |
Size of stream-specific data | UINT32 | 4 |
Stream number | UINT16 | 2 |
Unknown | UINT32 | 4 |
Type-specific | - | Variable |
Stream-specific | - | Variable |
Field | Type | Size (bytes) |
Picture width | UINT32 | 4 |
Picture height | UINT32 | 4 |
Unknown | UINT8 | 1 |
BITMAPINFOHEADER size | UINT32 | 4 |
Picture format | BITMAPINFOHEADER | Variable |
5、音频流类型数据:
Field | Type | Size (bytes) |
Sound format | WAVEFORMATEX | 14 |
Sound format extension | - | Variable |
Field | Type | Size (bytes) |
H, Total number of audio blocks in each scramble group | UINT8 | 1 |
W, Byte size of each scrambling chunk | UINT16 | 2 |
Block_align_1, usually = nBlockAlign | UINT16 | 2 |
Block_align_2, usually = nBlockAlign | UINT16 | 2 |
Unknown | UINT8 | 1 |
Field | Type | Size (bytes) |
Chunk type | GUID | 16 |
Chunk length | UINT64 | 8 |
Unknown | GUID | 16 |
Number of packets | UINT64 | 8 |
Unknown | UINT8 | 1 |
Unknown | UINT8 | 1 |
Packets | - | variable |
Field | Type | Size (bytes) |
0x82 | UINT8 | 1 |
Always 0x0 (?) | UINT16 | 2 |
Flags | UINT8 | 1 |
Flags are bitwise OR of: 0x40 Explicit packet size specified 0x10 16-bit padding size specified 0x08 8-bit padding size specified 0x01 More than one segment | ||
Segment type ID | UINT8 | 1 |
Packet size | UINT16 | 0 or 2 ( present if bit 0x40 is set in flags ) |
Padding size | Variable | 0, 1 or 2 ( depends on flags ) |
Send time, milliseconds | UINT32 | 4 |
Duration, milliseconds | UINT16 | 2 |
Number of segments & segment properties | UINT8 | 0 or 1 ( depends on flags ) |
Field | Type | Size (bytes) |
Stream ID | UINT8 | 1 |
Sequence number | UINT8 | 1 |
Segment-specific fields | - | Variable |
Field | Type | Size (bytes) |
Fragment offset | UINT8, UINT16 or UINT32 | Variable |
Flags | UINT8 | 1 |
Object length | UINT32 | 4 |
Object start time, milliseconds | UINT32 | 4 |
Data length | UINT8 or UINT16 | 0, 1 or 2 |
Data | - | Variable |
Field | Type | Size (bytes) |
Object start time, milliseconds | UINT8, UINT16 or UINT32 | Variable |
Flags | UINT8 | 1 |
Unknown | UINT8 | 1 |
Data length | UINT16 | 0 or 2 |
Repeat until we run out of data length: | ||
Object length | UINT8 | 1 |
Data | - | Variable |
... |
联系客服