在2010年11月28日,我在盛大举办的WeDoSwf会议上,我做了一个演讲,主题就是关于Swf的文件格式和Abc文件的混淆。

最近一个多月的时间里面,各种零零总总的事情特别多,一直没有时间把这个东西整理好放到博客中。

首先呢,把我的演讲的视频的ppt放上来:
视频:
http://v.ku6.com/show/MwjMgfhEgUFoiZhx.html

PPT:
http://www.slideshare.net/swfsh/swfabc

然后呢,经过我们的努力,我们已经将这个东西做成了一个产品,有兴趣的朋友可以去我们的公司主页上下载试用:
http://www.orandea.com/product?lang=cn

回到正题。在上一篇博客中,我已经说明了为什么需要对Swf文件进行加密,那接下来说说Swf文件和Swf内嵌的Abc文件的文件格式:

Swf文件格式

Swf文件格式呢,是Flash Player所使用的文件格式。Swf文件格式具有一下几个特点:

  • 基于Tag的流媒体技术
  • 内建压缩支持

这两个技术,尤其是第一个技术对于Flash的发展起到了至关重要的作用。

基于Tag的流媒体技术

Swf文件是由文件头和一系列的Tag组成的,下面这张图很好的说明了Flash的文件结构:

我们可以将Swf文件看成一个串流,然后顺序的从头读到尾来进行播放。
那么有那些种类的Tag呢?
这里说几个经典的:

  • SetBackgroundColor

    这个顾名思义就是设定swf的背景颜色的,我们在编译Flash的时候,设定的背景颜色最终就会生成这个Tag

  • ShowFrame

    接触Flash比较早的朋友应该都知道,在很久很久以前(我是慢羊羊村长),网络上的大部分Flash是可以一边下载一边播放的,这在当初56kbps的小猫时代可谓是惊天地泣鬼神的功能啊,当时互联网上涌现出了一大批的优秀的Flash动画作品;哎呀,扯远了,回来回来。说说ShowFrame的用途吧:在Flash里面,你可以通过其他的Tag定义位图,定义图形,定义补间动画,然后再放到舞台上去,而这个ShowFrame的作用就是把这一帧的画面显示出来,意义重大吧:)

  • DoAbc

    我们都知道,从Flash 9开始,Flash引入了Avm2虚拟机、Abc文件格式和AS3语言,大大提高了Flash中脚本的执行效率。所以Flash9应该算是划时代的一个版本啊。DoAbc类型的Tag的作用就是把Abc文件嵌入到Flash中

我们先来用Swfspy看看,我们的Swf文件到底包含些什么东西:

具体Tag的定义,大家可以参考一下参考文件中的“swf_file_format_spec_v10.pdf”。

内建压缩支持

从Flash6开始Swf文件格式开始支持压缩功能,主要的压缩算法采用的是zlib中的deflate算法。
通过Swf文件的第一个字节我们就可以分辨出这是压缩的Swf文件还是平铺的Swf文件。
第一个字节是Signature byte,如果是'F'表示该Swf文件没有压缩过,如果是'C'表示该Swf文件采用了deflate算法压缩。
这里需要注意的是,Swf文件的压缩从容是从SWF File Header的第9个字节开始的,也就是从FrameSize字段开始,就全是压缩的内容了。
这里同时给大家提供一个建议就是,对于纯位图的资源文件,建议不要采用压缩的文件。因为本身所有的位图数据不是采用JPEG格式压缩的就是采用zlib格式压缩的,如果再采用压缩格式的Swf,那就会导致用户的Flash Player需要解码两次才能访问图片数据。

Abc文件格式

Adobe在设计Avm2和Abc文件格式的时候,大量参考了Java的设计。Abc文件格式几乎是Java中的class文件格式的翻版。
此外Adobe在Swf文件格式和Abc文件格式使用了大量的相似但是不同的基本数据格式,最典型的例子就是可变长无符号整形的存储,在Swf文件格式中是U30格式,最多使用4个字节,但是到了Abc文件里面就变成了AbcU30,最多使用5个字节。给开发工作带来了很多麻烦。
Abc文件格式是一种结构化的文件格式,主要由以下几个部分组成:

  • 版本号

    Abc文件格式的版本号,现在只有一种可能,就是16.20

  • 常量池

    常量池是Flash为了减小Swf的体积,加快Swf的运行速度设计的一个基础设施,主要包括了“整形常量”、“无符号整形常量”、“双精度浮点常量”、“字符串常量”、“命名空间常量”、“命名空间集常量”、“Multiname常量”,非常多,但是对于咱们程序员而言并不复杂。

  • 元数据

    主要是各种类、方法、函数、常量、属性等等等等的声明信息

  • 方法体

    方法具体包含的的指令都在这个部分保存。

Abc文件格式的具体内容,限于篇幅就放到下篇文章里面吧!

参考资料

 

快速连接

posted on 2011-01-17 17:28  TonyHuang  阅读(2161)  评论(6编辑  收藏  举报