:::: 菜单 ::::

Flash文件格式说明

SWF文件头
字段
类型
备注
标识
8位
标识字节:
F代表未压缩
C代表已压缩(SWF6以后的版本特有)
标识
8位
代表W
标识
8位
代表S
版本号
8位
代表SWF文件的版本,比如0x06代表SWF6
文件长度
32位
整个文件的所占的字节数
帧大小
RECT结构
SWF场景的大小,单位为1twip(1/20像素)
帧速度
16位
帧数
16位
影片总的帧数目
1. 文件头以三个标识符开始,他们不是0x46, 0x57, 0x53 (“FWS”)就是0x46,0x57, 0x43 (“CWS”).一个FWS标识表示该文件是未压缩文件.CWS标识表示整个文件,在前八个字节,也就是文件长度字段之后所有的内容,都是开放标准 ZLIB压缩过的.用ZLIB库的数据格式,在Request for Comments (RFCs) 1950到1952文档中有所描述.CWS仅在SWF6以后才允许使用.
2. 标识符之后的一个字节是版本号.这个版本号不是一个ASCII字符,而是一个8位的数字.例如,SWF4文件的版本号是0x04,不是ASCII字符”4”(0x35).

3. 文件长度字段代表包括文件头整个文件的总长度.如 果是一个未压缩的SWF文件(FWS标识符),文件长度字段表示文件的精确大小;如果是一个压缩的SWF文件(CWS标识),文件长度字段表示解压后文件 的大小,这样一般就不是实际文件的大小了.让未压缩(解压后)的大小可见,则可以使解压过程更加有效.
4. 帧大小字段表示影片的宽度和高度.它存在一个RECT结构中,表示它的大小可以根据坐标(四个点的坐标)数值的变化而变化.文件大小RECT通常是这样的形式:Xmin和Ymin成员都为0;Xmax和Ymax成员声明宽度和高度.(参考Using Bit Values一节)
5. 帧速率表示理想的每秒播放帧数.如果SWF文件包含声音流数据,或者Flash播放器运行在一个慢的CPU上,这个速率是不能保证的.
6. 帧数表示SWF影片总的帧数目
注意:
1. swf的长度单位,swf使用twips表示坐标中的距离,1 twips=1/20 pixel
2. swf使用8位,16位,32位,64位,有符号和无符号整形类 型。所有的整形都是用little-endian的字节顺序(即数值低位储存在字节高位)。然后在每一个字节中采用big-endian编序。例子:16 位的0xe712 被保存成 12 e7; 32位的0x456e7120 被保存成20 71 6e 45.
3. swf中有两种定点数16位(8.8)和32位(16.16)。使用little-endian字节顺序
4. swf中有3种浮点数: 16位(半精度half),32位(单精度float),64位两种(双精度double)
5. 变长数(bit value)是长度可变的数,在swf中应用于RECT结构.变长数可以表示无符号,有符号,和16.16定点数。变长数不须要byte对齐(其他类型须 要),如果需要byte对齐的类型紧接着变长数出现,需要补零。bit value作为不同的类型在解释上使用补0补1的方法。比如SB[4](有符号4位变长数) = 1110解释成16位有符号整形为 1111111111111110 = –2。
Rect结构的定义:
Field
Type
Comment
Nbits
UB[5]
定义Xmin这样的每一项要使用多少位
Xmin
SB[Nbits]
矩形的最小x值
Xmax
SB[Nbits]
矩形的最大x值
Ymin
SB[Nbits]
矩形的最小y值
Ymax
SB[Nbits]
矩形的最大y值
Nbits用来决定使用多少位来储存Xmin,Xmax…的每一项,比如有一个矩形(decimal表示十进制,binary表示二进制)
简记符表:
UIx x位无符号整型;(如UI8表示8位无符号整型,即一个byte的无符号整型)
SIx x位有符号整型;
UIx[n] x位无符号整型的长度是n的数组;
SIx[n] x位有符号整型的长度是n的数组;

FIXED  32位 16.16定点数
FIXED8 16位 8.8定点数

FLOAT16 16位半精度浮点数
FLOAT   32位单精度浮点数
DOUBLE  64位双精度浮点数

UB[n] n位变长数表示无符号整型
SB[n] n位变长数表示有符号整型
FB[n] n位变长数表示定点数

Flash标签格式
每个标签都以标签类型和长度开头。标签头格式有两种,短型和长型。短型标签头用在数据不超过62字节的标签;长型标签头则可用在比实际用到的大小大得多的4GB之内的任何标签中。
标签头(短型)
字段
类型
备注
TagCodeAndLength(标签类型和长度)
16位
高10位:标签类型
低6位:标签长度
假如标签是63字节或者更长,它具有长型标签头。长型标签头就好像一个以0x3f开头的短型标签头,后面跟着一个32位长度。
标签头(长型)
字段
类型
备注
TagCodeAndLength(标签类型和长度)
16位
标签类型和标签长度(这儿的标签长度不是真实的)合起来是0x3f,包装起来像短型标签头
长度
32位
标签长度
定义型标签和控制型标签
定义型标签:这类标签定义SWF影片的内容,如各种形状,文字,位图,声音等等。每个定义型标签在内容被定义都分配了一个唯一的标识号给它,这叫做角色标识(character ID)。flash播放器则把这些角色放到一个存储空间里面,这个存储空间我们一般叫它字典。用定义型tag是不会绘制任何图形的,不会产生任何动画的。
控制型标签:这类标签用来产生和操作字典中的角色实例的渲染,并且控制影片的流程。
SWF标签的排序
总的来说,标签可以出现任何情况的排序方法,但也不是随便乱排, 它遵循一些规则:
1.一个标签只能依靠在它之前的标签,不能依靠在它之后的标签.
2.一个定义了角色的定义型标签必须在引用这个角色的控制型标签之前。
3.流媒体标签必须有顺序,没有顺序的流媒体播放起来也是没有顺序的
4.结束标签(tag)应该在SWF文件的最后。
字典
字典是已经定义好的所有角色的仓库,并且可以通过控制型标签来使用它。建立和使用字典的过程是以下这样的:
1. 一个定义型标签定义了一些内容,如形体,字体,位图或者声音。
2. 定义型标签给该内容赋上一个唯一的角色标识(CharacterID)。
3. 依据角色标识把内容存到字典中。
4. 一个控制型标签根据角色标识字典中找出相应的内容,然后给这个内容执行一些动作,比如显示一个形体,或者播放一个声音。每个控制型标签都 只指定一个唯一的标识。相同的标识是不允许的。举个象征性的例子,第一个角色的标识是1,第二个角色的标识是2,依次类推。角色标识为0的是一个特殊的标 识,被看作是空角色。控制型标签并不是唯一指向字典的标签。定义型标签也可以指向多个角色来定义一些更复杂的角色。例如,定义按钮 (DefineButton)和定义精灵(DefineSprite)标签都是根据其它角色来定义它们的内容的。定义文字(DefineText)标签可 以指向字体角色来为文字选择不同的字体。
处理一个SWF文件
Flash播放器在一个显示帧标签到来之前会处理显示帧标签之前SWF文件的所有标签。在这个时候,播放列表被复制到屏幕上面,与此同时 Flash播放器在处理下一帧之前是空闲的。第一帧所显示的内容,是在第一个显示帧标签之前的所有控制型标签操作产生的累积效果。第二帧所显示的内容,是 从文件开始到第二个显示帧标签所有控制型标签操作产生的累积效果。以此类推。
文件压缩策略
既然SWF文件在网络连接中传输得非常频繁,那它们当然是越紧凑越好。有很多技术可以实现这点。这是我们选中的几种有效的策略:
重用 角色字典的结构使得重用SWF文件元素非常容易。例如,一个形体、按钮、声音、字体或者位图,可以在文件中只存一次,但用到很多次。
压缩 形体使用了非常有效的差值编码方法来压缩,经常直线的开始坐标是上一条直线的最终坐标。距离经常由上一个位置的坐标来表达。
默认值 有一些结构像矩阵和色彩变换都有一些共同的属性用得比其它的多。比如一个矩阵,最常用的属性就是平移属性,而缩放与旋转则用得相对少点。因此如果没有定义 缩放属性,就假定它的值为100%,如果没有定义旋转属性,就假定它的值为没有旋转。使用默认值可以使文件大小最小化。
变化编码 作为一种规则,SWF文件只存储两种状态之间的变化。它由形体数据结构和播放列表中使用的定位/移动/移除模块反映出来。
形体数据结构 形体数据结构使用了一种独特的结构,使得形体的文件大小最小化,并且使得形体在屏幕上的平滑抗锯齿处理非常有效。

延伸阅读