Macromedia Flash文件格式(SWF)详细说明书(现归Adobe公司所有) 1、2章

本文根据“Macromedia Flash文件格式(SWF)详细说明书”翻译而来,其原版归Adobe公司所有,特此声明。

---------------------------------------

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
影片的总帧数
* 此类型在基本数据类型一节中定义
文件头部是由一个三字节的标识符开始,为 0x46 0x57 0x53 “FWS” )或者 0x43 0x57 0x53 “CWS” )其中之一。 “FWS” 标识符说明该文件是未压缩的 SWF 文件, “CWS” 标识符则说明该文件前 8 个字节之后(即文件长度字段之后)的全部数据为开源的标准 ZLIB 方式压缩。
ZLIB 库所使用的数据格式在 1950 1952 年的请求注解 , Internet 标准文档( RFCS )中被详细说明。 CWF 文件压缩形式仅适用于版本 6 或者更高。
标识符之后是一个字节的版本号,这个版本号并不是一个 ASCII 码,而是一个 8 位的数字,比如,版本 4 0x04 标识,而不是 ASCII “4” 0x35 )。
文件长度字段是整个包含文件头在内的文件字节长度,如果是未压缩的 SWF 文件(标识符 FWS ),那么长度字段应该是和文件大小恰好匹配,如果是一个经过压缩的 SWF 文件(标识符 CWS ),那么文件长度字段是指文件经过解压缩之后的总长度,因此它一般不会和文件大小匹配,使用未压缩的文件尺寸能够让解压过程获得更高的效率。
帧尺寸字段定义了影片的宽度和高度,它使用了 RECT 结构进行存储,这就意味着它的尺寸能够根据坐标编码所需的位数变化。帧尺寸的 RECT 结构使用的 X Y 轴的最小值总为 0 。而 X Y 轴最大值分别表示了宽度和高度(参阅位值的使用)
帧率是以帧每秒为单位的帧回放比率,此比率在 SWF 文件包含流式声音数据或者 Flash 播放器运行在低速 CPU 下时并不会得到保证。
帧数是整个 SWF 影片帧的总数量。
SWF文件结构
       文件头之后是一系列连续的标签数据块,所有的标签都共享一种通用格式,因此任何解析 SWF 文件的程序都能跳过它不能识别的数据块。块内数据能够指向当前一个块内的偏移量,但不能指向其它数据块内的偏移量。这就使得标签能够被处理 SWF 文件的工具进行移除、插入或修改操作。

SWF文件格式
 

 

标签格式
       每个标签都是由一个类型和一个长度值开始的,存在两种标签头部格式:短格式和长格式。短标签头部用于 62 字节或者更小的标签数据,长标签头部能够用于任何大小不超过 4GB 的标签数据,从长远来看这将会是非常实用的。
记录头部(短)
字段
类型
说明
标签编码和长度
U16
10 位:标签类型
6 位:标签长度
注意:标签编码和长度字段并不是一个 10 位的位字段后面跟着 6 位的位字段,而是一个双字节的字, SWF 文件不间断的字节排序使得这两者具有不同的布局。
该字段中的长度并不包含标签开始处的记录头部(即该字段所占有的长度)。
如果标签的长度大于或者等于 63 字节,那么它会被存储在长标签头部。长标签头部由一个标识长度为 63 字节( 0x3f )的短标签头部和一个 32 位的长度组成。
记录头部(长)
字段
类型
说明
标签编码和长度
U16
以短标签头部方式存储的
长度为 63 字节的标签编码和长度
长度
UI32
标签的长度
描述标签和控制标签
SWF 中的标签分描述标签和控制标签两种:
描述标签 这种标签描述了 SWF 影片的内容 形状、文本、图像、声音等等。每个定义标签都为其描述的内容指定了一个被称为 角色 ID” 的唯一 ID Flash 播放器把这些角色存放在一种叫 字典 的库里。描述标签本身不能驱动某个事件的产生。
       控制标签 这种标签可以创建和驱动字典中角色的实例,控制影片的播放。
SWF文件标签分类
       通常, SWF 文件中的标签可以任意出现。但尽管如此,也必须遵循少数几个规则:
1、 一个标签只能依赖前面定义过的标签。任何一个标签都不能依赖在才后面定义的标签。
2、 描述标签必须在使用它的任何控制标签之前定义。
3、 流式声音标签必须以顺序方式存储。不规范的流式声音标签将会导致声音播放不正常。
4、 结束标签一般是 SWF 文件的最后一个标签。
字典
       字典是存放已经定义好的角色的库,它可以被控制标签所应用。字典的建立和使用应遵循以下规则:
1、 描述标签定义了诸如形状、字体、位图或者声音。
2、 每一个描述标签都被指定一个唯一的角色 ID
3、 字典中的内容被存储在角色 ID 之后。
4、 控制标签能够通过角色 ID 在字典中找到所需内容并对其执行某种操作,例如显示形状或者播放声音。
每个角色 ID 必须指定一个唯一的 ID ,不允许重复 ID 。例如,第一个角色 ID 1 ,第二个是 2 。角色 0 被指定为表示空角色的专用 ID
并不是只有控制标签才能引用字典。描述标签同样也可以使用字典中的数据进行更复杂的角色定义。例如,按钮和剪辑标签都使用到了定义它们内容的角色。文本标签也包含了字体角色以便于为文本选择不同的字体。
以下图表说明了描述标签、控制标签和字典之间的一种典型交互关系:
 
 
 
* 详见显示列表
处理SWF文件
       Flash 播放器会在遇到 显示帧 标签之前处理 SWF 文件中所有的标签。这样,显示列表将被复制到场景中,在处理下一个帧之前 Flash 播放器会一直处于空闲状态。第一帧的内容是第一个显示帧之前的所有控制标签操作所积累的效果。而第二个帧的内容是第二个显示帧之前的所有控制标签操作所积累的效果,依此类推。
文件压缩策略
       由于 SWF 文件在网络中的传输日趋频繁,那么文件被尽可能的压缩将是非常重要的。有几种方法可以达到此目的。以下提到几种方法:
       复用 角色字典的结构能够让 SWF 文件的元素很方便的得到复用。例如,形状、按钮、字体或者位图可以被一次存储,多次引用。
       压缩 当一条线的起始坐标被假定是前一条线的结束坐标的时候,形状能够使用一种非常有效的三角编码方式压缩。距离一般也使用与最后位置的相对关系来表示。
       默认值 矩阵和颜色转换式通常拥有比其他结构更为通用的字段。例如:对于矩阵,转换字段是它最常用的字段,而缩放比例和旋转使用比较少。因此如果缩放字段没有出现,那么它会被默认为 100 %。如果旋转字段没有出现,那么就假定没有旋转。使用默认值能够缩小文件尺寸。
       改变编码 按规定, SWF 文件只能将变化存放在状态之间。但显示列表使用的形状数据结构和位置、运动、移动模型却是相反的。
       形状数据结构 形状数据结构使用了唯一的结构来减小文件的尺寸以及非常有效的在场景中播放实名形状。
概要
       SWF 文件由头部和其后的许多标签组成。有描述标签和控制标签两种。描述标签定义了被视为角色的对象,它被定义在字典中。控制标签操作和使用角色,以及控制影片的流程。
 
第一章  Macromedia Flash SWF )第 7 版文件格式的新特征
 
       在这一章将描述 SWF 规范第 7 版本中的新特性
ActionScript(动作脚本)的扩展
       新的 ActionScript (动作脚本)字节码是在已经存在的 动作定义函数 的基础上扩展的 动作定义函数 2” ,它现在允许函数在寄存器里保存参数和局部变量。(版本 7 动作定义函数 字节码已经很少被用到,它将会在以后的版本被 动作定义函数 2” 代替)。 动作定义函数 2” 也使用了创建控制器和通用变量 this arguments super _root _parent _global 的存储。为了支持这些改进,动作存储寄存器使用 动作定义函数 2” 字节码现在能够访问多达 256 个寄存器。
       为了改进并遵从 ECMA-262 标准的 ActionScript (动作脚本),和对面向对象程序设计提供更多的支持,版本 7 引入了 ActionExtends (动作扩展)、 ActionCastOp (动作计算操作)和 ActionImplementsOp (动作实现操作)。这些文件格式的改变是为了支持 ActionScript2.0 ActionExtends 提供了创建两个类间的子类和超类关系的能力。通过 ActionCastOp Flash 播放器版本 7 或者之后的版本能够将一种类型的对象转换成另一种。 ActionImplementsOp ActionCastOp 指定了对象实现的接口。
       版本 7 ActionInstanceOf 将反映出对象是否实现了一个接口。
       ActionScript (动作脚本)目前通过 AcitonTry ActionThrow 字节码来进行异常处理。 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 播放器中回显示不清楚。由于在 DefineFontInfo DefineFontInfo2 DefineFont2 标签中使用新的 FontFlagsSmallText 标记, Flash 播放器版本 7 以及后继版本能够动态文本和输入文本字形轮廓的按照象素边界排列。
 
第二章   Macromedia Flash SWF )第 6 版文件格式
 
本章描述了 SWF 6 版本规范中引入的特性。
文件压缩
       6 版及后续版本的 SWF 能够通过压缩来减小它们的尺寸。这种方式的选择是由一种不同的文件头(用 CWS 来代替 FWS )来标识。压缩方法使用了流行的 ZLIB 标准。
Unicode的支持
       6 版及后续版本的 SWF 支持 Unicode 文本。
       6 版本的 SWF 加入了 DefineFontInfo2 标签。这是对 DefineFontInfo 标签的一个辅助扩展。 DefineFontInfo2 加入了语言编码字段。同样, DefineFontInfo2 标签使用了以前保留的字节来存储语言编码。语言编码的使用是为了折行和当设备字体不存在的时候来选择一种可靠的字体考虑的。
       DefineFontInfo DefineFont2 DefineFontInfo2 标签在第 6 版及后续版本的 SWF 中有着不同的使用规则。角色表使用 ANSI shift-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 字节码 ActionGreater ActionStringGreater 。它们实现了 ActionLess ActionStringLess 的严格对应。它消除了使用逻辑否来执行小于或大于的必要。以此改善了性能并且消除了由于无意识的改变 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 中的按钮动作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值