Macromedia Flash文件格式(SWF)详细说明书

本文根据“Macromedia Flash文件格式(SWF)详细说明书翻译而来,其原版归Adobe公司所有,特此声明。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Macromedia Flash文件格式(SWF)详细说明书

Macromedia Flash文件格式(SWF)(读作“swiff”)是Macromedia Flash播放器在互联网上进行矢量图形和动画发布的文件格式。SWF文件格式不是为图像编辑器之间共享图像而是为高效的解释格式设计的,它的设计是为了满足以下条件:

在屏幕上即时显示:此格式的最主要目标是在屏幕上即时显示和支持实例,彩色图像的快速播放,动画和交互式按钮。

可扩展性:此格式为标签式格式,因此其播放器能够通过增加新的特性来进行升级而兼容其播放器的早期版本。

网络发布:此格式能够在有限的网络资源和不可预测的网络状况下进行传输,文件被压缩到很小并且支持流式播放。SWF文件是一种二进制格式的文件,它不能像HTML文件一样可以直接阅读和理解。SWF文件使用了诸如位压缩、可选字段式结构等方法来减小文件的尺寸。

简易性:此格式简单的结构使Flash播放器变得很小且便于携带。另外,Flash播放器仅仅依赖操作系统特性中有限的集合。

文件独立性:文件的显示不依赖任何诸如字体之类的扩展资源。

可变性:文件能够在有限的硬件环境下很好的工作,而且能够尽可能的利用更好的硬件,这一点很重要,因为用户的计算机有着不同的显示器设置和色深。

速度:文件能够以很快的速度和很高的质量播放。

支持脚本:此格式包含了约定格式的标签,标签规定了堆栈式机器解释字节码的顺序。字节码支持一种叫做ActionScript(动作脚本)的语言。Flash播放器规定了运行时的ActionScript(动作脚本)模式,此模式允许原始的绘制、服务和Flash播放器特性之间相互作用。

SWF文件的扩展名为.swf,它是一种MIME(多用途的网际邮件扩充协议)类型的应用程序(X-Shockwave-Flash)。

SWF格式经历了若干个版本。在第5个版本中,SWF的标签设置经过了一次较大规模的充实和完善。从第6个版本之后,文件格式变化较小,例如仅在ActionScript中越来越多的Flash新特性部分或者完全的被实现。因此,如果打算增加SWF文件中使用较新特性的内容,那么就应该熟悉Flash播放器提供的ActionScript对象模型,对于这些最好的参考是O’Reilly的《ActionScript: the Definitive Guide》,由科林·莫克出版社出版。

SWF文件头

       所有的SWF文件均以以下头部开始:

SWF文件头

字段

类型 *

说明

签字标识

UI8

标识字符:

“F”表示未压缩

“C”表示已压缩(版本6或后续版本)

签字标识

UI8

此标识通常为“W”

签字标识

UI8

此标识通常为“S”

版本

UI8

单字节文件版本数(例如,0x06表示版本6

文件长度

UI32

整个文件的字节长度

帧尺寸

RECT

单位帧的尺寸

帧率

UI16

每秒的帧数,其16个位是按照8.8的格式表示的

帧数

UI16

影片的总帧数

* 此类型在基本数据类型一节中定义

文件头部是由一个三字节的标识符开始,为0x460x570x53“FWS”)或者0x430x570x53“CWS”)其中之一。“FWS”标识符说明该文件是未压缩的SWF文件,“CWS”标识符则说明该文件前8个字节之后(即文件长度字段之后)的全部数据为开源的标准ZLIB方式压缩。

ZLIB库所使用的数据格式在19501952年的请求注解, Internet标准文档(RFCS)中被详细说明。CWF文件压缩形式仅适用于版本6或者更高。

标识符之后是一个字节的版本号,这个版本号并不是一个ASCII码,而是一个8位的数字,比如,版本40x04标识,而不是ASCII“4”0x35)。

文件长度字段是整个包含文件头在内的文件字节长度,如果是未压缩的SWF文件(标识符FWS),那么长度字段应该是和文件大小恰好匹配,如果是一个经过压缩的SWF文件(标识符CWS),那么文件长度字段是指文件经过解压缩之后的总长度,因此它一般不会和文件大小匹配,使用未压缩的文件尺寸能够让解压过程获得更高的效率。

帧尺寸字段定义了影片的宽度和高度,它使用了RECT结构进行存储,这就意味着它的尺寸能够根据坐标编码所需的位数变化。帧尺寸的RECT结构使用的XY轴的最小值总为0。而XY轴最大值分别表示了宽度和高度(参阅位值的使用)

帧率是以帧每秒为单位的帧回放比率,此比率在SWF文件包含流式声音数据或者Flash播放器运行在低速CPU下时并不会得到保证。

帧数是整个SWF影片帧的总数量。

SWF文件结构

       文件头之后是一系列连续的标签数据块,所有的标签都共享一种通用格式,因此任何解析SWF文件的程序都能跳过它不能识别的数据块。块内数据能够指向当前一个块内的偏移量,但不能指向其它数据块内的偏移量。这就使得标签能够被处理SWF文件的工具进行移除、插入或修改操作。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

08ac4758c64f4f929e035063b98e5d54.gif

SWF文件格式

 

 


标签格式

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

记录头部(短)

字段

类型

说明

标签编码和长度

U16

10位:标签类型

6位:标签长度

注意:标签编码和长度字段并不是一个10位的位字段后面跟着6位的位字段,而是一个双字节的字,SWF文件不间断的字节排序使得这两者具有不同的布局。

该字段中的长度并不包含标签开始处的记录头部(即该字段所占有的长度)。

如果标签的长度大于或者等于63字节,那么它会被存储在长标签头部。长标签头部由一个标识长度为63字节(0x3f)的短标签头部和一个32位的长度组成。

记录头部(长)

字段

类型

说明

标签编码和长度

U16

以短标签头部方式存储的

长度为63字节的标签编码和长度

长度

UI32

标签的长度

描述标签和控制标签

SWF中的标签分描述标签和控制标签两种:

描述标签这种标签描述了SWF影片的内容形状、文本、图像、声音等等。每个定义标签都为其描述的内容指定了一个被称为角色ID”的唯一IDFlash播放器把这些角色存放在一种叫字典的库里。描述标签本身不能驱动某个事件的产生。

       控制标签这种标签可以创建和驱动字典中角色的实例,控制影片的播放。

SWF文件标签分类

       通常,SWF文件中的标签可以任意出现。但尽管如此,也必须遵循少数几个规则:

1、一个标签只能依赖前面定义过的标签。任何一个标签都不能依赖在才后面定义的标签。

2、描述标签必须在使用它的任何控制标签之前定义。

3、流式声音标签必须以顺序方式存储。不规范的流式声音标签将会导致声音播放不正常。

4、结束标签一般是SWF文件的最后一个标签。

字典

       字典是存放已经定义好的角色的库,它可以被控制标签所应用。字典的建立和使用应遵循以下规则:

1、描述标签定义了诸如形状、字体、位图或者声音。

2、每一个描述标签都被指定一个唯一的角色ID

3、字典中的内容被存储在角色ID之后。

4、控制标签能够通过角色ID在字典中找到所需内容并对其执行某种操作,例如显示形状或者播放声音。

每个角色ID必须指定一个唯一的ID,不允许重复ID。例如,第一个角色ID1,第二个是2。角色0被指定为表示空角色的专用ID

并不是只有控制标签才能引用字典。描述标签同样也可以使用字典中的数据进行更复杂的角色定义。例如,按钮和剪辑标签都使用到了定义它们内容的角色。文本标签也包含了字体角色以便于为文本选择不同的字体。

以下图表说明了描述标签、控制标签和字典之间的一种典型交互关系:

 

 image002.gif

 

* 详见显示列表

处理SWF文件

       Flash播放器会在遇到显示帧标签之前处理SWF文件中所有的标签。这样,显示列表将被复制到场景中,在处理下一个帧之前Flash播放器会一直处于空闲状态。第一帧的内容是第一个显示帧之前的所有控制标签操作所积累的效果。而第二个帧的内容是第二个显示帧之前的所有控制标签操作所积累的效果,依此类推。

文件压缩策略

       由于SWF文件在网络中的传输日趋频繁,那么文件被尽可能的压缩将是非常重要的。有几种方法可以达到此目的。以下提到几种方法:

       复用角色字典的结构能够让SWF文件的元素很方便的得到复用。例如,形状、按钮、字体或者位图可以被一次存储,多次引用。

       压缩当一条线的起始坐标被假定是前一条线的结束坐标的时候,形状能够使用一种非常有效的三角编码方式压缩。距离一般也使用与最后位置的相对关系来表示。

       默认值矩阵和颜色转换式通常拥有比其他结构更为通用的字段。例如:对于矩阵,转换字段是它最常用的字段,而缩放比例和旋转使用比较少。因此如果缩放字段没有出现,那么它会被默认为100%。如果旋转字段没有出现,那么就假定没有旋转。使用默认值能够缩小文件尺寸。

       改变编码按规定,SWF文件只能将变化存放在状态之间。但显示列表使用的形状数据结构和位置、运动、移动模型却是相反的。

       形状数据结构形状数据结构使用了唯一的结构来减小文件的尺寸以及非常有效的在场景中播放实名形状。

概要

       SWF文件由头部和其后的许多标签组成。有描述标签和控制标签两种。描述标签定义了被视为角色的对象,它被定义在字典中。控制标签操作和使用角色,以及控制影片的流程。

 

第一章 Macromedia FlashSWF)第7版文件格式的新特征

 

       在这一章将描述SWF规范第7版本中的新特性

ActionScript(动作脚本)的扩展

       新的ActionScript(动作脚本)字节码是在已经存在的动作定义函数的基础上扩展的动作定义函数<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2”,它现在允许函数在寄存器里保存参数和局部变量。(版本7动作定义函数字节码已经很少被用到,它将会在以后的版本被动作定义函数2”代替)。动作定义函数2”也使用了创建控制器和通用变量thisargumentssuper_root_parent_global的存储。为了支持这些改进,动作存储寄存器使用动作定义函数2”字节码现在能够访问多达256个寄存器。

       为了改进并遵从ECMA-262标准的ActionScript(动作脚本),和对面向对象程序设计提供更多的支持,版本7引入了ActionExtends(动作扩展)、ActionCastOp(动作计算操作)和ActionImplementsOp(动作实现操作)。这些文件格式的改变是为了支持ActionScript2.0ActionExtends提供了创建两个类间的子类和超类关系的能力。通过ActionCastOpFlash播放器版本7或者之后的版本能够将一种类型的对象转换成另一种。ActionImplementsOpActionCastOp指定了对象实现的接口。

       版本7ActionInstanceOf将反映出对象是否实现了一个接口。

       ActionScript(动作脚本)目前通过AcitonTryActionThrow字节码来进行异常处理。ActionTry声明了异常条件的操作,而ActionThrow可以抛出一个已经被抛出的错误的值。

新的视频格式

       Flash播放器版本7简单的支持一种新的被称作屏幕视频位流格式的无损视频编码,它能够让动作以最优化的方式显示在计算机屏幕。屏幕视频像Sorenson H.263位流格式,能够同时用于SWF文件和FLV文件。

       Flash播放器版本7能够直接回放FLV文件,而不使用RTMP协议或者Flash Communication MX服务器。

运行时ActionScript控制

       新的ScriptLimits标签提供了最大递归深度和脚本超时之前的控制。

SetTabIndex

       新的SetTabIndex标签为每个Flash播放器标签顺序中的对象设置了索引。

回调事件的创建

       除已经存在的ClipEventInitialize之外,ClipEventFlags顺序现在包含了ClipEventConstruct来标识创建事件。

小型文本演示

       在以前,由于某种原因,小的实名文本在Flash播放器中回显示不清楚。由于在DefineFontInfoDefineFontInfo2DefineFont2标签中使用新的FontFlagsSmallText标记,Flash播放器版本7以及后继版本能够动态文本和输入文本字形轮廓的按照象素边界排列。

 

第二章 Macromedia FlashSWF)第6版文件格式

 

本章描述了SWF6版本规范中引入的特性。

文件压缩

       6版及后续版本的SWF能够通过压缩来减小它们的尺寸。这种方式的选择是由一种不同的文件头(用CWS来代替FWS)来标识。压缩方法使用了流行的ZLIB标准。

Unicode的支持

       6版及后续版本的SWF支持Unicode文本。

       6版本的SWF加入了DefineFontInfo2标签。这是对DefineFontInfo标签的一个辅助扩展。DefineFontInfo2加入了语言编码字段。同样,DefineFontInfo2标签使用了以前保留的字节来存储语言编码。语言编码的使用是为了折行和当设备字体不存在的时候来选择一种可靠的字体考虑的。

       DefineFontInfoDefineFont2DefineFontInfo2标签在第6版及后续版本的SWF中有着不同的使用规则。角色表使用ANSIshift-JIS编码选项已经被提出异议,因此这些标签中所有的角色表都使用了UCS-2编码。

       6版及后续版本的SWF中设备字体的名称使用UTF-8编码方式规定,而不是以前使用的现场特效编码。

       6版及后续版本的SWF中普通的STRING类型也使用了UTF-8编码来演示而不是以前使用的ANSI或者shift-JIS编码。

命名锚点

       6版引入了命名锚点的概念,SWF文件中的一个帧标签允许在浏览器的URL顶层使用hash(记号)来搜索一个帧,它类似于HTML页面中的命名锚点。在第6版及后续版本的SWF中,命名锚点通过在FrameLabel标签的STRING非终结符之后包含一个额外的字节来编码。

ActionScript扩展

       6版及后续版本的SWF中,DoInitAction标签包含了和SWF文件Acition(动作)一样的ActionScript字节码。但是,当DoAction标签中指定的动作被放置在堆里,并且在帧被全部绘出之前没有被激活,那么只要遇到此标签时,DoInitActions标签会被激活。DoInitAction被用来实现ActionScript语言中的initclip pragma。这对于在放置一个类定义场景里的符号的实例之前,调用registerClass来关联一个影片剪辑符号是非常有用的。

       按钮电影剪辑在Flash6中是一个新的概念。这就意味着按钮符号中,影片剪辑的实例除了传统的影片剪辑句柄之外,还允许拥有和按钮符号类型相同的事件句柄。这样,第6版及后续版本的SWF中,事件类型包含的按钮类型的事件句柄,能够被使用在指向一个剪辑动作中,该动作属于影片剪辑符号的PlaceObject2标签。

       SWF版本6增加了ActionScript字节码ActionStrictEquals。它在ActionScript语言中实现了一个新的严格的相等操作符(= = =)。

SWF版本6增加了ActionScript字节码ActionGreaterActionStringGreater。它们实现了ActionLessActionStringLess的严格对应。它消除了使用逻辑否来执行小于或大于的必要。以此改善了性能并且消除了由于无意识的改变ActionScript的赋值顺序而造成的影响。

SWF版本6增加了ActionScript字节码ActionInstanceOf。它在ActionScript语言中实现了“InstanceOf”操作符。

SWF版本6增加了ActionScript字节码ActionEnumerate2。它的工作与ActionEnumerate类似,但是操作在对象类型堆而不是一个变量名上。

从第6个版本开始,人们开始喜欢EnableDebugger2标签并开始屏弃EnableDebugger标签。

新的音频、视频格式

       6版及后续版本的SWF中,已经存在的DefineSound SoundStreamBlock标签支持新的编解码选项“NellyMoser Asao”,为低比特率而优化(参见Nellymoser Compression)。

       两个标签DefineVideoStream VideoFrame,允许视频包含在第6版及后续版本的SWF中。第6版本中,使用了“Sorenson Spark”视频编码(参见Sorenson H.263 Bitstream Format)。

FLV文件格式

       SWF内容可以在Communication Server MX的支持下.执行动态双声道音频、视频和数据交互。交互中,Communication Server能够预先记录或者FLV格式的流式文件提供服务,它将音频、视频和数据进行同步编码。FLV中音频、视频的使用和SWF是一样的。和SWF格式一样,FLV格式也是Macromedia公司一种开放的标准文档。

改善的文件

       随着第6版说明书的发布,以下SWF文件格式各章节的文档已经被详细、透彻的修订过:

           声音

           字体和文本

           位图

           PlacePbject2中的剪辑动作

           DefineButton2中的按钮动作

 

转载于:https://www.cnblogs.com/qdlgx/archive/2008/09/05/1285171.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值