关于SWF文件格式的一些说明

SWF文件头结构如下:

字段            类型           说明
标识            8位             表示文件是否被压缩("46" F 为没有压缩,"43" C 为被压缩)。
标识            8位             总是 "57" W。
标识            8位             总是 "53" S。
版本号         8位             代表SWF文件的版本(如果是9,就为 "09")。
文件长度     32位            表示文件的大小。
帧大小         RECT结构    表示舞台的大小。
帧频            16位           每秒要播放的帧数。
帧数            16位           总共的帧数。

以一个实际的未压缩SWF文件头为例子来分别说明上述字段:

46 57 53 05 B4 66 07 00 70 00 0F A0 00 00 BB 80 00 0C 9F 03

(1)字节1-3:46 57 53  <"FWS">

       文件头以三个标识符开始,只能是0x46, 0x57, 0x53 (“FWS”)或者0x46, 0x57, 0x43 (“CWS”)。一个FWS标识表示该文件是未压缩文件.CWS标识表示从文件的第九个字节开始的所有内容,都是经过开放标准ZLIB压缩过的。CWS格式仅在SWF6以后才允许使用。

(2)字节4:05

       在标识符之后的一个字节是版本号。这个版本号不是一个ASCII字符,而是一个8比特位的数字。例如,SWF5文件的版本号是0x05,不是ASCII字符"5"(0x36)。

(3)字节5-8:B4 66 07 00

       一个Integer表示文件的长度。低在前,高在后,这里长度表示为0x000766B4 = 485044字节。文件长度字段代表包括文件头整个文件的总长度。如果是一个未压缩的SWF文件(FWS标识符),文件长度字段表示文件的精确大小;如果是一个经过压缩的SWF文件(CWS标识),文件长度字段表示解压后文件的大小,这样一般就不是实际文件的大小了。让未压缩(解压后)的大小可见,可以使解压过程更加高效。

(4)字节9-X:

       这一段长度非固定,这是一个RECT结构。它表示的大小可以根据坐标(四个点的坐标)数值的变化而变化。文件大小RECT通常是这样的形式:Xmin和Ymin成员都为0;Xmax和Ymax成员声明宽度和高度。RECT的解析涉及到如下结构:

Bit Values 格式
Type        Comment
SB[nBits]   有符号位值 (nBits表示用多少位来存储这个值)
UB[nBits]   无符号位值 (nBits表示用多少位来存储这个值)

RECT 格式
Field       Type             Comment
Nbits        UB[5]            Bits used for each subsequentfield
Xmin        SB[Nbits]      x minimum position for rectangle in twips
Xmax        SB[Nbits]     x maximum position for rectangle in twips
Ymin        SB[Nbits]      y minimum position for rectangle in twips
Ymax        SB[Nbits]     y maximum position forrectangle in twips

       也就是说要解析出SWF文件的显示区域,步骤是这样的:得到第9个字节的前5位,这里就是0x70-->0x0E,即14。那么之后的字节就按照14比特位进行分割,共需要4(坐标点数) * 14(所占比特位) + 5(位指示) = 61 bits <> 8 Bytes。于是乎,从第9个字节到第16个字节就是RECT结构体所占用的字段:70 00 0F A0 00 00 BB 80 。解析如下:

01110000-00000000-00001111-10100000-00000000-0000000-010111011-10000000
01110-00000000000000-01111101000000-00000000000000-01011101110000-000
14-0-8000-0-6000 

       因为Flash的坐标是TWIP格式的,单位为1twip(1/20像素),所以得到的数据需要除以20的,即实际RECT值为(0,400,0,300)。

(5)字节17-18:00 0C

       这两个字节表示帧速率。前一字节表示小数位,后一字节表示整数位,不过一般极少有小数位的帧率,所以一般我们只计整数就可以了,这里是0x0C,即每秒12帧。注意,这是一个理想的每秒播放帧数值,如果SWF文件包含声音流数据,或者Flash播放器运行在一个慢的CPU上,这个速率是不能保证的。

(6)字节19-20:9F 03

       这两个字节表示Flash文件总的帧数,这里为0x039F = 927 帧。

SWF文件内容结构如下:

       在文件头后面的是一些标签化的数据块。所有的标签都是用一种通用格式。所以任何程序在解析一个SWF文件时,都可以跳过那些还不明确的块。在每个块中的数据可以指向这个块中的偏移量,但绝不能指向另外一个块的偏移量。这样,在用工具处理SWF文件的时候就任意可以删除、插入和修改(而SWF文件不会被破坏)。

       每个标签都是由一个类型和一个长度值开始的,存在两种标签头部格式:短格式和长格式。短标签头部用于62字节或者更小的标签数据,长标签头部能够用于任何大小不超过4GB的标签数据,从长远来看这将会是非常实用的。

1、记录头部(短)

字段                    类型        说明

标签编码和长度    U16          高10位:标签类型;低6位:标签长度

注意:标签编码和长度字段并不是一个10位的位字段后面跟着6位的位字段,而是一个双字节的字,SWF文件不间断的字节排序使得这两者具有不同的布局。该字段中的长度并不包含标签开始处的记录头部(即该字段所占有的长度)。如果标签的长度大于或者等于63字节,那么它会被存储在长标签头部。

2、记录头部(长)

字段                    类型         说明

标签编码和长度    U16           以短标签头部方式存储的长度为63字节的标签编码和长度

长度                      U32          标签的长度

注意:长标签头部由一个标识长度为63字节(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播放器在处理下一帧之前是空闲的。第一帧所显示的内容,是在第一个显示帧标签之前的所有控制型标签操作产生的累积效果。第二帧所显示的内容,是 从文件开始到第二个显示帧标签所有控制型标签操作产生的累积效果。以此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值