2023年12月17日发(作者:)
Macromedia Flash (SWF) 7.0 文件格式说明书
SWF文件头:
所有SWF文件头都具有如下内容(格式定义见第三章基本数据格式):
内容
Signature
类型
UI8
描述
标记字节:
“F”表示无压缩;“C”表示压缩(6.0以后播放器支持)
Signature
Signature
Version
FileLength
FileSize
FrameRate
FrameCount
UI8
UI8
UI8
UI32
RECT
UI16
UI16
标记字节:“W”
标记字节:“S”
单字节文件格式(例如:0x06表示SWF 6)(版本)
整个文件的字节数
文件大小
帧每秒钟播放的像素数
文件的总帧数
文件开头包含0x46,0x47,0x53(“FWS”)或者0x46,0x57,0x43(“CWS”)三个字节大小的域。FWS标记表示无压缩的SWF格式文件;CWS表示在使用标准的ZLIB压缩完8个字节长度FileLength域后的域。数据格式使用1950到1952通用标准文档的ZLIB库进行描述。只有在SWF6.0以后版本才允许进行CWS文件压缩。
然后是一个字节的版本域。版本域不是ASCII字符而是一个8位的数字。例如:SWF4.0版本的版本字节是0x04,而不是ASCII字符‘4’(0x35)。
在文件头中文件长度域包含了SWF文件的总长度。如果是无压缩的SWF(FWS域)文件,文件长度域储存文件的大小。如果是压缩的SWF文件,文件长度域存储压缩后的文件大小,这样一般不用计算文件的大小。如果无压缩有效,则能够进行更有效的压缩处理。
FrameSize(帧大小)域定义了动画的宽度和高度。并以RECT格式存储,也就是它翻译人:高磊 网站:
1
Macromedia Flash (SWF) 7.0 文件格式说明书
的大小依照需要的字节大小进行改变。X和Y坐标一直保持为0;最大坐标值用来定义动画的宽度和高度。(见使用字值)。
FrameRate(帧速)表示每秒帧的播放速度。这个速度不是在SWF文件中流声音数据的速度或运行在低速率CPU上的速度。
FrameCount(帧数)指SWF动画的总帧数。
SWF 文件结构:
下面的SWF文件头由几个连续的标签(Tag)数据块组成。所有的标签(Tag)都是一个格式,因此分析一个SWF文件不用去了解这些数据块。数据块中的数据指向它内部的数据,但不能指向其他数据块内部的数据。这样便于使用工具对SWF文件进行增加、删除、修改标签(Tag)。
Header
Tag
Tag
Tag
….
End Tag
标签(Tag)格式:
每个标签(Tag)都包含标签(Tag)类型和长度。有两种标签(Tag)头格式,长类型和短类型。短标签(Tag)用于标识小于62字节的数据。长标签(Tag)头能够标识4GB大小或者更大的数据。
内容 类型 描述
大于10bit:标签(Tag)类型
小于6bit:标签(Tag)长度
注意:TagCodeAndLength域是两个字,并不是6个bit加10个bit。SWF使用两个不同排序排列字节。
TagCodeAndLength不包含标签(Tag)开始的RECORDHEADER长度。
如果大于等于63bit,将存储成一个长标签(Tag)头。长标签(Tag)头由32位长度短标TagCodeAndLength UI16
签(Tag)头加上0x3f长度的标签(Tag)头组成。
翻译人:高磊 网站:
2
Macromedia Flash (SWF) 7.0 文件格式说明书
内容
TagCodeAndLength
类型
UI16
描述
0x3f的标签(Tag)长度和类型
整个打包成一个短格式头
Length
定义和控制标签(Tag):
UI32
标签(Tag)长度
SWF中有两种类型的标签(Tag):
定义型标签(Tag):这种标签(Tag)定义SWF动画的内容如:变形、文本、位图、声音等。每个定义标签(Tag)定义一个唯一的字符型ID来标示它定义的内容。播放器存储这些字符ID到一个叫做字典(Dictionary)库中。定义标签(Tag)完全由系统自己完成。
控制标签(Tag):这种标签(Tag)建立和操作字典(Dictionary)中的字符标示的实例(Instance)并且控制动画的播放。
SWF中的标签(Tag)顺序:
一般来说,SWF中的标签(Tag)可以任意排列。然而,必须遵循下面的几点小的规则:
1. 标签(Tag)仅仅依靠它上面的标签(Tag)。一个文件中只能有一个结束标签(Tag)。
2. 定义标签(Tag)必须定义字符标示在所有控制标签(Tag)之前。
3. 声音流标签(Tag)必须顺序排放。错误的排列(Out-of-order)的声音流标签(Tag)会导致播放错误(Out-of-order)。
4. 结束标签(Tag)必须在SWF文件末尾。
字典(Dictionary):
字典(Dictionary)用于存储字符的定义和为控制标签(Tag)提供字符数据。处理和使用字典的过程如下:
1. 定义标签(Tag)定义内容例如:一个图像,字体,位图或声音。
翻译人:高磊 网站:
3
Macromedia Flash (SWF) 7.0 文件格式说明书
2. 定义标签(Tag)指定一个唯一标示字段ID到这些内容。
3. 存储内容到字典(Dictionary)的对应字符ID下。
4. 控制标签(Tag)从字典(Dictionary)中读取字符ID的内容进行处理,例如显示图形或者播放声音。
每个定义标签(Tag)必须定义唯一ID。不允许重复ID。例如:第一个字符ID是1,第二个字符ID是2,等等、、、。字符0用来指定和表示一个空的字符。
并不是控制标签(Tag)才能使用字典(Dictionary)。定义标签(Tag)也能够利用字典中的字符内容来定义更复杂的内容。比如,DefineButton(定义按钮)和DefineSprite(定义图形)标签(Tag)利用其他的字符内容来定义他们自己的内容。DefineText(定义文字)标签(Tag)能够通过字体字符ID中的内容来定义文本的字体。
下面的图表示出一个典型的定义标签(Tag)、字典(Dictionary)和控制标签(Tag)间复杂交互作用的例子。
翻译人:高磊 网站:
4
Macromedia Flash (SWF) 7.0 文件格式说明书
处理SWF文件过程:
Flash 播放器直到遇到ShwoFrame标签(Tag)才停止处理所有的标签(Tag)。也就是显示列表拷贝到屏幕并且直到播放器空闲时再处理下一帧。在ShowFrame标签(Tag)之前第一帧的内容影响所有控制帧的执行。在第二个ShowFrame标签(Tag)之前的第二帧则影响所有控制标签(Tag)的执行,依次类推、、、
翻译人:高磊 网站:
5
Macromedia Flash (SWF) 7.0 文件格式说明书
文件压缩机制:
在网络之间SWF频繁传输,那么它的大小就非常重要。这里有几个方法解决这个问题。如下所示:
重用:在一个SWF文件的结构字符字典(Dictionary)中的字符就非常适合重用。例如,一个图形、按钮、声音、字体或位图能够只存储一次却可以使用许多次。
压缩:
运行ActionScript控制:
新的ScriptLimits标签(Tag)提供控制最大计算递归和可能第二次超时的问题脚本。
设置TabIndex:
新的SetTabIndex标签(Tag)设置Flash播放器内部的Tab顺序。
ClipEventConstruct(剪辑事件结构):
ClipEventFlags顺序现在包含ClipEventConstruct的消息机制,另外也包含现有的ClipEventInitialize。
小文本描述:
在以前,由于某些原因,播放器中小的anti-aliased文本可能出现模糊不清的情况。
DefineFontInfo、DefineFontInfo2和DefineFont2标签(Tag)中新的FontFlagsSmallText在Flash播放器7.0中动态输入的文本将以像素进行排列字符。
翻译人:高磊 网站:
6
Macromedia Flash (SWF) 7.0 文件格式说明书
第一章 Macromedia Flash(SWF)7.0文件格式的新内容
这章将介绍SWF7.0文件格式新增加的内容。
增强了动作脚本(ActionScript extensions):
新的ActionScript字节码ActionDefineFunction2在ActionDefineFunction的基础上增加了功能,现在提供了存储函数变量和本地变量到注册表。(ActionDefineFunction应用在SWF7.0以前的文件格式中,后来被ActionDefineFunction2代替了),ActionDefineFunction2也一样支持影片控制和通用的变量:this、arguments、super、_root、_parent和_global。使用ActionDefineFunction2目前支持最多256个注册表操作。
改进了ActionScript使它符合ECMA-262标准,并且提供了对面向对象程序设计的全面支持,SWF7对在ActionScript2.0中才有的ActionExtends、ActionCastOP和ActioinImplementOP提供了支持。ActionExtends主要是为了实现类间的继承以及子类和父类间的调用;ActionCastOP用来进行类型转换;ActionImplementOP用来定义接口。
现在SWF7文件格式中用ActionInstanceOf可以判断一个对象是否实现了接口。
现在ActionScript可以用ActionTry和ActionThrow来捕获并处理异常。ActionTry捕获异常,ActionThrow用来抛出一个异常错误值。
新的视频格式:
Flash Player 7支持一种新的叫做Screen Video Bitstream 格式的无损视频解码器,可以清晰的捕获动态屏幕动态图像。ScreenVideo可以像Sorenson H.263 Bitstream
格式那样发布成SWF和FLV格式的文件。
Flash Player 7能够不使用RTMP协议和Flash Communication Server MX就直接翻译人:高磊 网站:
7
Macromedia Flash (SWF) 7.0 文件格式说明书
播放FLV格式的文件。
运行时动作脚本控制
新的ScriptLimits标签(Tag)提供了跳过可能产生超时或者死循环的脚本的控制机制。
Tab键切换索引
SetTabIndex实现了在播放器中的对象间的热键切换。
剪辑事件架构
ClipEventFlags现在包含ClipEventConstruct来实现事件架构间的通信,增强了现有ClipEventInitialize的功能。
文本输出校正:
以前某些小anti_aliased字体的文字播放时会模糊不清,在DefineFontInfo、DefineFontInfo2和DefineFont2标签(Tag)中增加了新的FontFlagSmallText标签(Tag),在Flash Player 7中播放或动态输入文字时会按像素校正文字。
第二章 Macromedia Flash(SWF)6.0文件格式
本章介绍SWF6的文件格式。
文件压缩
SWF6和以后的版本能通过压缩文件来减少大小。用一个不同的文件头标签(Tag)来标识压缩(CWS代替了FWS)。压缩使用了ZLIB标准。
Unicode支持
SWF6或以后的版本支持Unicode格式的文本。
SWF6增加了DefineFontInfo2标签(Tag)。
命名标签(Tag)(Named anchors)
翻译人:高磊 网站:
8
Macromedia Flash (SWF) 7.0 文件格式说明书
SWF 6 增加了命名标签(Tag)(Named anchors),在浏览HTML页面中的SWF动画中允许用一个标签(Tag)来标识URL、命名标签(Tag)。在SWF 6 或后续版本的文件格式在将命名标签(Tag)(Named anchors)在现有的帧标签(Tag)标记以Null结尾的字符串后面被编码成一个扩展的字节。
ActionScript 增强
SWF 6和后续版本文件中DoInitAction标签(Tag)和SWF 3 Actions一样都包含了的字节码。可是,当帧指定了DoAction标签(Tag)会直到所有帧上的动画都加载成功后再执行,定义成DoInitAction标签(Tag)的动作一加载就会执行。DoInitAction在ActionScript语言中用来实现初始化#initclip pragma。这对于在舞台上实例化一个用registerClass声明的含有影片剪辑的符号(symbol)很有用。
按钮剪辑是Flash 6中新的概念。这意味着影片剪辑符号(symbol)具有和按钮符号(symbol)同样的事件句柄(event handlers),另外还有影片剪辑的句柄。因此,在SWF 6或后续版本中包含按钮样式的句柄可以用在PlaceObject2标签(Tag)标识的影片剪辑(Movie Clip)上。
SWF 6增加了ActionScript字节码,ActionStrictEquals。使ActionScript语言提供比(==)更严格的比较操作。
SWF 6新增了ActionScript字节码:ActionGreater和ActionStringGreater。这些扩展了ActionLess和ActionStringLess字节码。这样通过用很小的逻辑判断减少了进行需要大量比较的运算。在ActionScript中这样能非常有效的避免了无意的性能降低。
SWF 6 加入了ActionScript字节码:ActionEnmerate2。类似ActionEnumerate,但是操作一个变量名比操作一个对象类型的栈要好的多。
从SWF 6 开始,EnableDebugger2标签(Tag)来代替了EnableDebugger。
翻译人:高磊 网站:
9
Macromedia Flash (SWF) 7.0 文件格式说明书
新的音频和视频格式
在SWF6或后续版本中现存的DefineSound和SoundStreamBlock标签(Tag)支持了新的编码格式:NellyMoser Asao,更加优化了压缩(见Nellymoser Compression)。
两个标签(Tag):DefineVideoStream和VideoFrame,允许SWF6或后续版本包含视频。SWF6中增加了新的视频编码器:Sorenson Spark(见Sorenson H.263 Bitstream
Format)。
FLV文件格式
SWF能通过Flash Communication Server MX播放两声道的音频、视频和数据整合。交互的一种就是Flash Communication Server能够通过FLV格式处理字节或流文件,同步的解码声音、视频和数据。FLV和SWF一样处理音频和视频格式。FLV格式类似SWF格式是Macromedia的一种开发标准格式。
改进了文档
SWF 6 发布的版本规范,SWF文件格式对以下格式在后续章节中都有详细的说明:
1. 声音
2. 字体和文本
3. 位图
4. PlaceObject2中的剪辑动作
5. DefineButton2中的按钮动作
第三章 基本数据类型
在Macromedia Flash (SWF)文件格式中基本数据类型是其他复杂数据结构的基础。其他数据类型都是建立在这个基本类型基础上的。
坐标(Coordinates)和缇(Twips)
翻译人:高磊 网站:
10
Macromedia Flash (SWF) 7.0 文件格式说明书
SWF用整数类型存储x,y坐标值,通常使用缇(Twip)作为坐标单位。SWF文件格式中一个缇(Twip)等于1/20的逻辑像素(logical pixel)。SWF文件在100%播放的时候一个逻辑像素(logical pixel)等于屏幕上的一个像素(pixel)。
例如:一个800×400Twips的文件可以折算成40×20pixel。这样的像素(pixel)大小有利于消除边缘锯齿。一个790×390twips(39.5×19.5pixels)的矩形的边缘会很平滑。
Twips是介于大小和精度间好的解决办法。在要求对象进行精确调整定位的时候Twips能够实现更好的定位。
在SWF文件格式中坐标(Coordinates)仍然用传统的坐标轴:x轴坐标值从左到右,y轴从下到上递增。
整数和字节顺序:
SWF文件使用8-bit,16-bit,32-bit和有符号、无符号的整数类型。在SWF文件中使用little-endian类型的字节存储整数类型值:和在Intel x86系统一样首先存储最小的字节,然后依次存储更多字节。字节(bit)排列顺序是big-endian:先存储重要的数据,然后存储首字节。
例如:
32-bit的值0x456e7120将存储成:20 71 6e 45
16-bit的值0xe712将存储成:12 e7
所有的整数类型都必须是byte-aligned。也就是在SWF文件中第一个存储字节的bit值是整数值的第一个bit。
有符号的整数值用传统的2’-complement字(bit)存储方式。有很多的有符号的表示方式。2’complement表示系统中首字节1表示负数,0表示正数。一个负数 -n 用减零方式进行表示 n-1。
翻译人:高磊 网站:
11
Macromedia Flash (SWF) 7.0 文件格式说明书
浮点数(Fixed Point Number):
浮点数用32位的16进制数表示正负浮点数值。小数点前的用前16 bit 表示,小数点后的用后16 bit表示。在SWF文件中浮点数存储成32位整数并且必须字节对齐。
例如:
7.5表示为:0×0007.8000
在SWF文件中存储格式为:00 80 07 00
bit类型:
Bit值是可变长度字节字段,用来表示三种类型的数值:
1. 无符号的整型
2. 有符号的整型
3. 有符号的16.16像素点值
翻译人:高磊 网站:
12
Macromedia Flash (SWF) 7.0 文件格式说明书
Bit值不能够排序。其他类型(像UI8和UI16)是一直排序字节。如果下面的字节排序类型,最后的字节用0值填补。
在64位值的流下面,非常长的9位字节成功的,下面的UI16值:
Byte1和Byte2两个字节以6-bit值(BV1)开始接着下面5-bit值(BV2)。BV3介于Byte2和Byte3之间,BV4包含在Byte3里。Byte5包含两个字节值:BV7和BV8。Byte6长度UI16里BV9其余四个字节用0填充。
当一个无符号的bit值从左到右插入一个长字节其他地方用0值填充。当一个有符号的bit值拷贝左边的bits插入到长字节。
这叫sign extension。例如,无符号4-bits值UB[4]=1110像一个16-bit值像:1110 =14。像一个有符号值说明相同值,SB[4]=1110会转换成11110 =-2。
有符号bit值相似,不过必须记录有符号bit数。有符号的35值表示为SB[7]=0100011。额外的0字节用来表示符号。
固定浮点bit值是32位的16.16有符号浮点值。小数点前面的表示16位数据,小数点后面的表示这16位数值。一个小数bit值同样的有符号的bit值,但是不同的解释。例如,一个19bits有符号值0x30000用196608十进值。19-bit浮点值0x30000是3.0。格式化这个值有效的3.16和16.16值比较。
翻译人:高磊 网站:
13
Macromedia Flash (SWF) 7.0 文件格式说明书
使用bit类型:
Bit值用有序的最小的bits值。用固定bits数值表示更多的bits值。很多都用可变数表示bits值,但是在所有例子里,在相同的结构里另一个字段中用bits值。这些可变长度的用例,SWF-generating 应用程序必须确定指定的描述真值表示这bits最小值。有符号的值保持,如果数字实际编码,第一个头0用来排序表示这个额外bit;另外符号改变这个bit值到负数值。
这是一个变长的bit值例子,包含这个RECT结构:
这Nbits字段值确定这bits值用来存储同等的Xmin,Xmax,Ymin和Ymax。下面的矩形用下面的格式表示:
Nbits用来描述这坐标值。在这个例子514值(字节)请求11个bits表示。矩形用下面的存储:
翻译人:高磊 网站:
14
Macromedia Flash (SWF) 7.0 文件格式说明书
字符(String)类型:
一个字符值用来表示null值字符值。格式化字符值是一个以null字符byte值结尾的byte列表表示。
在SWF5或以前版本,STRING值是用ANSI(扩展ASCII值)或者Shift-JIS(一个日本编码)。在Flash播放器运行时用来编码方式用来表示编码。SWF5或以前版本的text内容只能编码ANSI或shift-JIS,并且这个观众必须知道作者,否则混淆text结果。
SWF6或后续版本,STRING值用UTF-8标准表示。这是多字节编码;每个字符在一或4个字节间压缩每个字符值。UTF-8是一个ASCII集;在UTF-8和ASCII比较映射0-127范围的byte,并且所有ASCII字符0-127用一个字节表示。UTF-8用一个或多个byte编码成0个字符。UTF-8字符里null字符用来避免内容表示,字符最后值用null字节表示结尾,像ASCII字符表示。
语言编码:
语言编码标识一个应用文本口头语言。在SWF里语言编码用指定字体关联表示。
注意:一个语言编码不能指定文本编码;它指定一个口头语言。
翻译人:高磊 网站:
15
Macromedia Flash (SWF) 7.0 文件格式说明书
FlashPlayer使用的语言编码来决定线性用动态文本标准尺度,当一个指定图形字体无效来选择可靠的字体。 使用的语言编码在未来的显示。
一个零语言编码表示‘没语言’。在Flash Player运行时在本地的配置结果。
在运行时,FlashPlayer下面是经过公认的语言编码:
1:Latin(Latin-1表示语言编码:English,French,German,etc.)
2:Japanese
3:Korean
4:Simplified Chinese
5:Traditional Chinese
RGB颜色:
RGB记录表示一个24bit的red,green和blue值
透明度(Alpha)的RGBA颜色:
RGBA格式是一个32-bit的red,green,blue和alpha值的颜色。一个RGBA颜色有一个255的透明值。一个RGBA颜色的零alpha值是透明的。Alpha值在0到255透明度之间。
翻译人:高磊 网站:
16
Macromedia Flash (SWF) 7.0 文件格式说明书
矩形:
一个矩形用定义的最小的x和y坐标还有一个最大的x和y坐标表示。
矩阵:
在2D图形中矩阵记录用2x3来表示一个排序使用。来用来描述比例,旋转和绘图对象。
翻译人:高磊 网站:
17
Macromedia Flash (SWF) 7.0 文件格式说明书
ScaleX,ScaleY,RotateSkew0和RotateSkew1字段是存储16.16像素值。TranslateX和TranslateY值是是twips中存储的有符号值。
矩阵记录使最优化的用例来描述一个矩阵。在这个用例里 HasScale和HasRotate
标记是零,并且这个矩阵包含TranslateX和TranslateY字节。
矩阵字段映射成2x3的矩阵:
任何的coordinates(x,y),转换coordinates(x’,y’) 表示为下面的形式:
下面的表格解释矩阵里的每个操作的类型:
翻译人:高磊 网站:
18
Macromedia Flash (SWF) 7.0 文件格式说明书
颜色转换:
CXFORM 记录定义了一个图形对象的颜色简单渐变。这有两个类型的渐变可能:
1. 多渐变
2. 附加渐变
多渐变用8.8像素点来表示red,green和blue组件。1.0的像素点是0x100或者255十进制表示。
任何color(R,G,B)渐变color(R’,G’,B’)公式如下:
另外,渐变色显示的时候用简单red,green和blue组件来表示。如果结果大于255,结果会被赋成255。如果结果小于0,结果被赋成0。
任何的color(R,G,B)和color(R’,G’,B’)的计算公式如下:
附加和多个渐变能够表示为下面的。多个操作首先执行。
翻译人:高磊 网站:
19
Macromedia Flash (SWF) 7.0 文件格式说明书
透明度(Alpha)颜色转换:
CXFORMWITHALPHA记录扩展了CXFORM的功能增加了允许颜色渐变应用在alpha通道,比如red,green和blue通道。
两个渐变类型:
1. 多层渐变
2. 附加渐变
多渐变用8.8像素值表示red,green,blue和alpha值。1像素值是用0x100或256十进制表示。因此,多个操作需要用256分隔。
任何color(R,G,B,A)转变成color(R’,G’,B’,A’)的公式如下:
CXFORMWITHALPHA记录一般用一个渐变的透明度来表示。多个alpha通道的值范围在0-255之间。
翻译人:高磊 网站:
20
Macromedia Flash (SWF) 7.0 文件格式说明书
附加渐变显示时使用red,green,blue和alpha组件。如果结果大于255结果被转换成255,小于0,被转换成0。
任何color(R,G,B,A)转换成color(R’,G’,B’,A’)的公式如下:
附加和多渐变能够表示如下。操作公式先执行。
第四章 播放目录(The Display List)
播放Macromedia Flash(SWF)的一帧需要三个基本步骤:
1. 首先,要用标签(Tag)定义每个对象,比如DefineShape、DefineSprite等。每个对象有个唯一的ID称为标识符(character),并且全部存储在字典(dictionary)里。
2. 然后,从字典(dictionary)里取出标识符(character)放到播放目录(Display
翻译人:高磊 网站:
21
Macromedia Flash (SWF) 7.0 文件格式说明书
list)中,列表中的字符将连续进行播放下一帧。
3. 最后,播放列表用ShowFrame显示到屏幕上。
播放目录(Display List)中的每个标识符(Character)都有一个深度(Depth)值。深度(Depth)值决定每个标识符的层叠顺序。深度值低的标识符将在深度值高的下面显示。深度值为1的标识符位于最底层,一个标识符可以在播放目录中多次出现,不过每次的深度值必须不同,也就是说任何深度都可以仅有一个标识符。
SWF1.0和SWF2.0中,播放目录只是一个简单的对象列表用来实时的持续在平面的指定位置播放。SWF3.0以后版本中,播放目录变成了分级列表,一个元件(element)播放时可以有它的子元件的列表。更多信息见DefineSprite.
用五个标签(Tag)来控制播放目录:
PlaceObject:在播放目录中增加一个标识符。
PlaceObject2:在播放目录中增加一个标识符并设置标识符的深度值。
RemoveObject:从播放目录中删除指定标识符。
RemoveObject2:删除指定深度上的标识符。
ShowFrame:按播放目录的顺序播放。
注意:SWF3.0和后续版本中一直沿用了PlaceObject和RemoveObject标签(Tag)。
下面的图表说明以上的播放步骤。首先,定义三个对象分别是:图形、文本和元件。这三个对象分配了三个唯一标识符存储到字典中。标识符1(图形)的深度为1,在播放栈的最底层,其他标识符都在它的上面。标识符2(文本)分成两部分,一部分在第二层,一部分在第4层,也就是最上层;标识符3(元件)设置在第三层。
翻译人:高磊 网站:
22
Macromedia Flash (SWF) 7.0 文件格式说明书
剪辑层(Chipping Layers)
播放目录中有一类特殊的对象就是Flash中的剪辑层(Chipping Layers)。剪辑层标识符播放时不显示,相当于它修剪(Clips)(或遮罩(Masked))位于它上面的标识符。PlaceObject2中剪辑深度 (ClipDepth) 用来指定剪辑层遮罩的最大深度。
比如设置深度为1的一个图形的剪辑深度(ClipDepth)为4,所有在第一层上的剪辑直到深度为4的那一层都将被第一层的图形遮罩。深度4以上的标识符不会被遮罩。如图所示:
翻译人:高磊 网站:
23
Macromedia Flash (SWF) 7.0 文件格式说明书
使用播放目录(Using the Display List)
下面是一步步创建并播放一个Flash动画的过程:
1. 定义每个标签(Tag)(Tag)的标识符(Character)。给定每个标识符(Character)一个唯一的标识ID,并加入到字典中。
2. 用PlaceObject2标签(Tag)添加每个标识符到播放目录中,PlaceObject2给每个标识符设置了播放时的如下属性:
深度值。这是用来控制将标识符顺序存储到栈中,标识符中低深度值的在高深度值的下面。深度值为1的表示在栈的底层。在任何深度中只能有唯一的一个标识符。
转换矩阵:用来确定标识符放置的坐标、比例、因数和旋转的角度。同一个标识符在不同深度可以有不同的转换矩阵。
颜色渐变(可选):来指定存储的标识符的颜色效果。颜色效果包括透明度翻译人:高磊 网站:
24
Macromedia Flash (SWF) 7.0 文件格式说明书
和颜色渐变。
名称(可选):用于SetTarget动作来作为唯一标识标识符对象。SetTarget动作用于执行剪辑对象内部的动作。
剪辑深度(可选):用来设置上面最多几层被本层遮罩。
比例(可选):用来控制变形标识符的存储后的播放信息。表示播放变形的起始比例为0.最多65535的比例用于变形播放。
3. 用ShowFrame标签(Tag)来将播放目录进行播放显示。
4. 用PlaceObject2标签(Tag)来播放目录中每个标签(Tag)。每个PlaceObject2建立一个新的变形矩阵按深度存储标识符。(没有指定标识符ID是因为不同深度的标识符可能一样。)
5. 通过ShowFrame标签(Tag)播放不同坐标的标识符。循环执行4和5的步骤播放动画的每一帧。
注意:如果一个标识符在每个帧中没有变化,则不重复在各帧中播放它。
6. 用RemoveObject2标签(Tag)来从播放目录中删除每个标识符。只删除有深度值的标识符。
播放目录标签(Tag)(Display List Tags):
播放目录标签(Tag)用来增加标识符和标识符属性到播放目录。
PlaceObject:
PlaceObject标签(Tag)用来在播放目录中增加一个标识符。唯一标识标识符的标识符ID(CharcaterID)同时被添加。Depth指定标识符在栈中的排列顺序。Matrix指定标识符的坐标、比例和旋转。如果转换矩阵(Transformation matrix)中PlaceObject的大小超出矩阵的大小时,则将默认把ColorTransform值添加到记录中。指定的颜色效果(比如渐变)也增加到标识符中。相同的标识符可以被增加到多个播放目录翻译人:高磊 网站:
25
Macromedia Flash (SWF) 7.0 文件格式说明书
的不同深度的转换矩阵中。
注意:SWF3以后的版本PlaceObject就不再使用了,而被PlaceObject2取代了。
SWF1的简单的文件格式:
PlaceObject2:
PlaceObject2增强了PlaceObject的功能。PlaceObject2提供增加标识符到播放目录和现有播放目录中标识符属性的功能。Flash4升级到Flash5的过程PlaceObject2标签(Tag)的改动不大。Flash5的剪辑动作(clip actions)就有了。
标签(Tag)包含一组动画标识值。可选的标识值有:CharacterId、Matrix、ColorTransform、Ratio、ClipDepth、Name和ClipActions。Depth值是必须的。
Depth值标识标识符在栈中的顺利。标识符Depth值低的在Depth值高的下面播放。Depth值为1的表示在栈的最后播放。一个标识符可以给定不同的深度。也就是播放目录中的一个标识符可以用他的Depth来标识。(CharacterId不是必须的)
PlaceFlagMove和PlaceFlagHasCharacter标识播放目录中是否增加了一个新的标识符或播放目录中的标识符是否被修改。具体含义如下:
PlaceFlagMove=0和PlaceFlagHasCharacter=1
在播放目录中给一个新增加的标识符(用CharacterID作为ID)分配了Depth。并设置了其他的属性值。
翻译人:高磊 网站:
26
Macromedia Flash (SWF) 7.0 文件格式说明书
PlaceFlagMove=1和PlaceFlagHasCharacter=0
标识符的Depth值已经被修改,其他的也被修改了。因为能够随意修改标识符的Depth,CharacterId并不是必要的。
PlaceFlagMove=1和PlaceFlagHasCharacter=1
指定Depth的标识符已经被删除,一个新的标识符被指定在这个Depth上。设置了标识符的其他属性。
比如,一个标识符的移动动画的起始帧用PlaceFlagHasCharacter设置,后续的帧里设置PlaceFlagMove。起始帧设置一个新的标识符到标准的Depth和变换矩阵(transformation matrix),后续帧只是简单的修改Depth和变换矩阵的值。
PlaceObject2中的可选属性具体含义如下:
CharacterID用来标识添加到播放目录中的Character。在创建一个新的Character时候就设置CharacterID,如果现有播放目录中的Character被修改了,CharacterID清空。
Matrix用来标识播放目录中添加和修改的Character的坐标、比例和旋转角度。
ColorTransform用来添加和修改的Character的颜色效果。
Ratio用来标识添加和修改的Character的变形(Morph)的Ratio(比率)。只用在DefineMorphShape的Character,并且控制处理变形(Morph)的最大值比例值。变形从Ratio值为0的Character开始。变形中每个Character的Ratio值最多有65535。Flash Player的运算器从0-65535来播放一个连贯的(in-between)的变形。
ClipDepth用来指定新增加的层用来遮罩的Depth数。ClipDepth为0表示不是一个Clipping Character。
Name用来指定修改和添加的Character的名字。典型的用这个属性来表示元件翻译人:高磊 网站:
27
Macromedia Flash (SWF) 7.0 文件格式说明书
(sprite)用来SetTarget动作标识元件。SetTarget动作用于执行剪辑对象内部的动作。
ClipAction用来指向character的存储位置,当事件触发时调用一个或多个事件句柄。
SWF3格式的简单内容如下:
Clip行为用来存储元件Character。Clip行为用来给一个元件定义事件句柄。翻译人:高磊 网站:
28
Macromedia Flash (SWF) 7.0 文件格式说明书
ClipEventFlags
ClipEventFlags为一个事件句柄指定一系列连贯的事件。SWF5以前是两个字节长度。SWF6以后变成4个字节长度。
翻译人:高磊 网站:
29
Macromedia Flash (SWF) 7.0 文件格式说明书
SWF6中对Button Movie Clip增加了很多事件,使普通的元件也可以作为按钮翻译人:高磊 网站:
30
Macromedia Flash (SWF) 7.0 文件格式说明书
(Button)来用(具体内容见ButtonCondAction)。在按钮(Button)的动作中DragOut事件是通过Press事件与Button状态事件进行发送消息实现的,具体消息通信内容在Button Events中描述。
KeyDown和KeyUp事件不再绑定具体的键值;任何键值都可以通过事件句柄来响应这些事件(专用键盘可能会引起异常)。具体哪个键值触发了事件可以用通过ActionScript的key对象来获得。
KeyPress事件和KeyDow、KeyUp事件不同。Keypress用精确的键值或ASCII字符来标识一个键(具体如何指定的见ClipActionRecord)。同样的KeyPress怎么实现的见ButtonCondAction。
RemoveObject(删除对象)
RemveObject用来删除播放目录中的指定Character(带Depth)。
SWF1的格式如下:
RemoveObject2
RemoveObject2用来按指定Depth删除播放目录中的Character。
SWF3的格式如下:
翻译人:高磊 网站:
31
Macromedia Flash (SWF) 7.0 文件格式说明书
ShowFrame:
ShowFrame标签(Tag)通知Flash Player播放播放目录的内容。动画进行单帧播放后暂停。
SWF1中的格式如下:
第五章 控制标签(Tag)(Control Tags)
控制标签(Tag)管理全部文件、帧和播放控制。
SetBackgroundColor(设置背景颜色):
SetBackgroundColor标签(Tag)设置播放时的背景颜色。
SWF1的格式如下:
FrameLabel(帧标签(Tag))
FramLabel标签(Tag)指定当前播放帧的名字。这个名字用于ActionGoToLabel来标识帧。
SWF3的格式如下:
SWF6.0以后版本增强了FrameLabel并成为Name anchors 。Name Anchor用来表示Frame label的类型,另外可以标识用于ActionGoToLabel和HTML链接的标识。翻译人:高磊 网站:
32
Macromedia Flash (SWF) 7.0 文件格式说明书
FlashPlayer6.0以后的浏览器插件核对nachor和浏览器地址栏地址(用#anchorname来表示)。如果在地址栏中指定的地址,播放器将从相同标识的帧开始播放,否则将从第一帧开始播放。另外,当FlashPlayer播放到含有name nachor的帧时将在地址栏的地址后面附加上命名标识。这就保证了当用户建立了标签(Tag),过后能够返回Flash动画的指定位置,name nachor细化了动画的控制粒度。
插入一个非空的字节到Name anchor来创建一个name anchor。SWF6以后的版本才有效。格式如下:
Protect(加密):
Protect标签(Tag)用来防止在编辑环境下导入编辑动画。如果加密SWF文件则,Protect标签(Tag)里没有数据,即tag length=0,如果这个标签(Tag)出现在SWF文件中,任何编辑工具都无法进行编辑。
如果Protect中含有数据,导入密码正确时SWF文件能够导入。Protect中的数据是用MD5算法加密的密码。SWF5后续的版本才支持加密密码。
MD5加密算法是Poul-Henning Kamp编写的开放算法。在FreeBSD的src/lib/libcrypt/crypt-md5.c中。MD5加密算法也用在EnableDebugger标签(Tag)中。
SWF2的Protect格式如下:
翻译人:高磊 网站:
33
Macromedia Flash (SWF) 7.0 文件格式说明书
End:
End标签(Tag)在文件的最后,它必须在文件的最后。End标签(Tag)也可以定义成一个元件。
SWF1的格式如下:
ExportAssets(输出资源):
ExprotAssets对应ImportAssets用来导出的SWF文件的一部分。例如,一个web站点的10个swf文件如果一个动画输出自定义字体成Character其他的可以共享。每个输出Character用字符串来标识,所有的character都能被输出。
SWF5以后的格式如下:
ImportAssets:
ImportAsset从其他SWF文件导入Character。通过获得外部的SWF文件的有效URL来导入SWF文件。在SWF文件中Import assets用character定义在Dictionary中。
外部SWF文件的URL可以是绝对路径和相对路径。如果是相对路径要相对于导入翻译人:高磊 网站:
34
Macromedia Flash (SWF) 7.0 文件格式说明书
SWF文件。
SWF5后续版本的格式如下:
EnableDebugger:
EnableDebugger标签(Tag)用于调试。和Protect标签(Tag)一样,EnableDebugger用MD5对密码进行加密。
SWF6版本以后EnableDebugger就不再使用了;Flash Player6以后版本的播放器不再解析这个标签(Tag)。由于SWF6以后版本ActionScript脚本中调试信息变化,改变了EnableDebugger的格式。SWF6以后用EnableDebugger2来替代。
SWF5以前的版本信息如下:
翻译人:高磊 网站:
35
Macromedia Flash (SWF) 7.0 文件格式说明书
EnableDebugger2:
EnableDebugger2用来调试。和Protect标签(Tag)一样,EnableDebugger用MD5对密码进行加密。
SWF6以后的版本格式如下:
ScriptLimits:
ScriptLimits标签(Tag)用来修改默认循环递归次数,有两个属性:MaxRecursionDepth和ScriptTimeoutSeconds。
MaxRecursionDepth设置Actionscript的最大递归次数。默认写的次数的256。默认值需要大于0。
ScriptTimeoutSecond属性设置播放器处理的最长的时间。ActionScript要结束的时候会窗口提示。
ScriptTimeoutSecond默认值在15和20秒之间。默认值可以被修改。
SWF7的格式如下:
翻译人:高磊 网站:
36
Macromedia Flash (SWF) 7.0 文件格式说明书
SetTabIndex:
本文档包含中Flash Player中交互播放的tab顺序切换内容。SWF6以后版本模拟了实际tab切换。SWF7中利用SetTabIndex标签(Tag)来指定tab切换顺序。
如果当前没有Character指定深度,则这个属性被胡略。ActionScript也可以控制Tab的切换顺序。不过tabIndex没办法指向文本对象,因为播放器没有定义文本对象的标签(Tag)。没关系,普通文本通常不用tab焦点。可是,这样存在问题,因为text对象存在焦点,这将影响tab的切换顺序。当编译SWF文件时将文本对象也设置了焦点,不过SetTabIndex标签(Tag)比.tabIndex属性有用。
下面是SWF7的格式:
第六章 运动(Actions)
Actions是SWF交互动画的精华所在。Actions允许动画对类似于鼠标移动单击等事件的响应。SWF3以前的版本只是实现了简单的动作模式,SWF4以后的动作模式进一步增强了功能,包含异常处理、变量、条件分支和循环等特性。SWF5的动作模式增加了类似Javascript的数据类型和函数。
翻译人:高磊 网站:
37
Macromedia Flash (SWF) 7.0 文件格式说明书
SWF3ActionModel:
SWF3的动作模式只包含了浏览器操作的11个基本操作。
SWF3的一个动作或系列动作能够根据按钮的状态触发。动作不是立即就执行,而是将它放置在动作列表中进行处理。在按钮状态改变或执行ShowFrame标签(Tag)的时候开始执行动作列表。一个动作能够触发其他的动作,然后把这系列动作添加到动作列表中进行处理。动作处理完动作列表里的动作结束。
默认的时间线动作包括:Stop、Play和GoToFrame来应用到动画处理中。可是,SetTarget动作在用户接口中为“Tall Target”用来给其他动画或元件发送一个动作指令。
有127个可能的动作,当前只定义了91个。
SWF3 Actions
下面是在SWF3中有效的动作。
DoAction Tag
当前帧编译时通知Flash Player播放动作列表动作。当遇到ShowFrame标签(Tag)时,翻译人:高磊 网站:
38
Macromedia Flash (SWF) 7.0 文件格式说明书
不管这个DoAction标签(Tag)在哪里都执行动作列表。
ActionRecord
ActionRecord是1Byte的动作编码。如果高bit的编码设置用16-bit的长度来存储动作。如果Highbit为空,则动作没有数据。
ActionGoToFrame
通知FlashPlayer播放当前动画中的指定帧。
ActionGetURL
通知Flash Player获得指定字符格式的URL的文件。URL指向的可以是网页、图片或者SWF动画。如果在浏览器中播放Flash,在帧中播放用TargetString指定的URL。指定的目标名字“_level0”和“_level1”用来分别在0和1层加载动画。
翻译人:高磊 网站:
39
Macromedia Flash (SWF) 7.0 文件格式说明书
ActionNextFrame
通知Flash Player播放当前动画的下一帧。
ActionPreviousFrame
通知Flash Player播放当前动画的前一帧。
ActionPlay
通知Flash Player开始播放当前动画。
ActionStop
通知Flash Player停止播放当前帧的动画。
ActionToggleQuality
设定播放动画的高低品质。
翻译人:高磊 网站:
40
Macromedia Flash (SWF) 7.0 文件格式说明书
ActionStopSounds
通知Flash Player停止播放所有声音。
ActionWaitForFrame
通知Flash Player等到指定帧;另外跳过指定数量的动作。
ActionSetTarget
通知Flash Player处理并发动作的执行,用于播放和当前动画同样标签(Tag)名称的动画。
比如,SetTarget动作可以用来控制时间上的元件对象。下面在时间线上顺序的动作发送给一个叫sprinner的元件。
1. SetTarget “Sprinner”
2. GoToFrame zero
3. SetTarget “”(Empty String)
4. End of Actions。(acions code=0)
1后面的所有动作直到3都一直执行,用来设置动作返回到当前动画。DefineShape中对target name 进行描述。
翻译人:高磊 网站:
41
Macromedia Flash (SWF) 7.0 文件格式说明书
ActionGoToLabel
通知Flash Player播放给定label的帧。每个帧可以用label来标识。
SWF4 Action Model:
SWF4支持一个更加强大的动作模型包括表达式、变量、条件判断和循环。
Macromedia Flash Player 4混合栈虚拟机进行解释和执行SWF4的动作。SWF4的key是ActionPush。这个动作用于将参数放到栈中。SWF4和SWF3不同在于标签(Tag)中不再含有参数了,而是push参数到栈中,栈满时pop参数出栈。
表达式求值程序也是基于栈的。算法器包括ActionAdd、ActionSubstract、ActionMultiply和ActionDivide。Flash编辑器将表达式编译成一系列的栈操作。比如,表达式1+X×3编译成下面的动作:
ActionPush “X”
ActionGetVariable
ActionPush “3”
ActionMultiply
ActionPush “1”
ActionAdd
翻译人:高磊 网站:
42
Macromedia Flash (SWF) 7.0 文件格式说明书
这个表达式用栈就是这么表示的。注意所有栈中的值有数字值也存储成字符类型。上例中的数值3和1在栈中都用字符型来存储的。
The Program Counter:
Flash Player执行的当前指针称Program Counter 简称“PC”。PC的值存储的是当前执行的Action的地址值。Control Flow的动作像ActionJump来改变PC值。其他寓言中在编译器中Actions有分支(Branch)和比较(similar)指令或者“go to”指令。例如,ActionJump通知Flash Player在Action列表中跳转“jump”到指定位置。从当前PC中指定一个新的分支PC。有正负之分,所以Flash Player能够在Action列表中前进和后退。
SWF4 Actions
SWF4中下面的Actions有效:
Arithmetic Operators
ActonAdd
ActionDivide
ActionMultiply
ActionSubtract
Numerical Comparison
ActionEquals
ActionLess
Logical Operators
ActionAnd
ActionNot
ActionOr
翻译人:高磊 网站:
43
Macromedia Flash (SWF) 7.0 文件格式说明书
String Manipulation
ActionStringAdd
ActionStringEquals
ActionStringExtract
ActionStringLength
Stack Operations
Type Conversion
Conrol Flow
Variables
ActionMBStringExtract
ActionMBStringLength
ActionStringLess
ActionPop
ActionPush
ActionAsciiToChar
ActionCharToAscii
ActionToInteger
ActionMBAsciiToChar
ActionMBCharToChar
ActionCall
Actionf
ActionJump
ActionGetVariables
翻译人:高磊 网站:
44
Macromedia Flash (SWF) 7.0 文件格式说明书
ActionSetVariables
Movie Control
ActionGetURL2
ActionGetProperty
ActionGotoFrame2
ActionRemoveSprite
ActionSetProperty
ActionSetTarget2
ActionStartTarget
ActionWaitForFrame2
ActionCloneSprite
ActionEndDrag
Utilities
ActionGetTime
ActionRandomNumber
ActionTrace
Stack Operations(栈操作):
下面是栈的操作。
ActionPush
将值放到栈中。
翻译人:高磊 网站:
45
Macromedia Flash (SWF) 7.0 文件格式说明书
ActionPush用来把值放到栈中。Type属性指定放入栈中的值类型。
如果Type=1,将一个32-bit IEEE single-Precision little-endian floating-point值放入栈中。PropertyIds把像tyIds用ActionGetProperty和ActionSetProperty访问命名对象的属性。
如果Type=4,将注册器编码放到栈中。Flash Player只支持4个注册器。ActionDefineFunction2可以利用256个以上的注册器。
ActionPop
从栈中删除值。
翻译人:高磊 网站:
46
Macromedia Flash (SWF) 7.0 文件格式说明书
ActionPop从栈中删除值和移除值。
Arithmetic Operators(算法操作器):
ActionAdd
两个数字相加到栈中。
ActionAdd如下这么做的:
1.从栈中将A值取出。
2.从栈中将B值取出。
3.转换A和B为floating-point;non-numberic值评估0值。
4.计算A+B。
5.A+B的结果到栈中。
ActionSubtract
栈中两个数相减。
ActionSubtract这么处理的:
1.从栈中将A值取出。
2.从栈中将B值取出。
3.转换A和B为floating-point;non-numberic值评估0值。
4.A减B
翻译人:高磊 网站:
47
Macromedia Flash (SWF) 7.0 文件格式说明书
5.将A-B的结果到栈中。
ActionMultiply:
栈中存储两个数的相乘。
ActionMultiply操作如下:
1. 从栈中将A值取出。
2. 从栈中将B值取出。
3. 转换A和B为floating-point;non-numberic值评估0值。
4. 计算A×B。
5. 将A×B结果放入栈中。
ActionDivide
计算B/A的栈中。
计算B/A的过程如下:
1.在栈中将A值取出。
2.在栈中将B值取出。
3.转换A和B为floating-point;non-numberic值评估0值。
4.计算B/A。
5.将B/A结果放入栈中。
6.如果A为0,结果返回#ERROR#字符串。
备注:当播放一个Flash5的SWF文件,NaN,Infinity or –Infinity将#ERROR#到栈中。
翻译人:高磊 网站:
48
Macromedia Flash (SWF) 7.0 文件格式说明书
Numerical Comparison(数字比较):
ActionEquals:
比较两个数字的值。
ActionEquals的比较过程:
1.在栈中将A值取出。
2.在栈中将B值取出。
3.转换A和B为floating-point;non-numberic值评估0值。
4.比较两个值的大小。
5.如果比较数大,在栈中放入1(True)值。
6.否则将 0(false)放入栈中。
备注:当播放一个Flash5的SWF文件,true用1来表示,用0来表示false。
ActionLess
比较A是否小于B。
ActionLess的处理过程:
1.在栈中将A值取出。
2.在栈中将B值取出。
3.转换A和B为floating-point;non-numberic值为0值。
4.如果B 注意:当播放一个Flash5的SWF文件,true用1来表示,用0来表示false。 翻译人:高磊 网站: 49
发布评论