# 新时代新潮流WebOS 【12】解剖Adobe Flash

- 作者：邓侃
- 发布时间：2009-03-21 22:05
- 原文：https://www.ifanr.com/17531

前文说到，Adobe Flash系统，包括三个方面，1. 制作工具，2. 播放器，Flash Player，3. 数据传输协议。理解Adobe Flash系统，或许可以从数据传输协议入手。数据传输协议体现在Flash的文件格式，Flash的文件格式很多，其中最重要的有三个，SWF，FLV 和AS。理解了这三个文件格式，Adobe Flash制作工具和播放器，就不难理解了。

- SWF，传输动画的文件格式。用户一边下载.swf文件，一边使用Flash Player播放。
- FLV，传输视频的文件格式，Flash制作者可以把FLV作为一个独立的文件，用户一边下载.flv文件，一边用Flash Player播放。也可以把FLV插入到SWF文件中去，作为一个片段。
- AS，ActionScript的缩写。ActionScript类似于JavaScript，解决与用户交互的问题。

### SWF 动画格式

1. 整个SWF由若干frames按顺序串联组成，每个frame的结尾处有特殊的tag（ShowFrame）作为标识。
2. 每段frame的内容分成两部分，一部分定义该frame中出现的角色（character），譬如形体，图像，按钮，文字等等。另一部分控制这些角色显现的位置，移动和变形，以及配音的播放等等。
3. Flash Player开始播放一段SWF前，它先处理几段frames。处理的结果，主要是把每一段frame的内容绘制在一幅bitmap上，把这幅 bitmap缓存在内存中。当完成了若干幅bitmaps以后，就可以开始播放，播放过程中，逐步处理后续的frames。
4. 假如整个SWF中总共出现N个角色，不需要在文件初始一揽子把它们全部定义清楚，而是可以在后续的frames中，陆续添加角色。Flash player开始播放前，会准备一份空白的角色名单。每出现一个新角色，就把它添加到名单中。
5. 每段frame可以调用先前frames中已经定义过了的角色，但是不可以调用后续frames中定义的角色。这样做的好处，是flash player不需要下载完整的SWF文件，而是在下载了一部分数据后，就可以开始播放。一边播放，一边继续下载后续的数据。
6. SWF采用分段压缩，也就是把每段frame的数据分别压缩，而不是把SWF文件作为一个整体压缩。这样做的好处，是支持一边播放一边下载的功能。但是也有代价，因为分段压缩的压缩比，显然不如整体压缩比。
7. Frame中出现的角色和控制键，都是以tag的形式来定义。Flash的制作者，可以自行定义特殊类型的tags，以便扩充现有flash的功能。但是每增加一个新类型的tag，不要忘记给flash player提供相应的插件。
8. 如果flash player在播放某一个SWF文件的过程中，遇到不能识别的tags，它会自动跳过，而不至于因为个别陌生的tags，影响整个SWF文件的播放。这样设计的好处，是既方便用户扩展flash的功能，又保证flash player播放的稳定。

[![Illustration of Flash Animation](https://s3.ifanr.com/wp-content/uploads/2010/08/IllustrationofFlashAnimation_thumb.gif "Illustration of Flash Animation")](https://s3.ifanr.com/wp-content/uploads/2010/08/IllustrationofFlashAnimation.gif)

 *Figure 1. Illustration of Flash Animation*

### FLV 视频格式

FLV是Flash Video的文件格式。其实FLV本身并不是一个视频格式，而是一个容器。容器里面可以装H.263，H.264, VP6或者其它格式的视频，同时可以装MP3格式的音乐。2007年8月推出的新版Flash Player 9， 更是强大到，能够支持MPEG-4旗下诸多格式的解码，包括H.264(MPEG-4, P10)，音频压缩格式AAC（MPEG-4，P3），MP4（MPEG-4，P14），屏幕下方文字走马格式3GPP（MPEG-4, P17）等等。

在Flash Player播放一段.flv文件时，Player知道，它将播放的是一段视频或者音乐，然后它进一步识别这段视频或者音乐用的是什么编码格式，根据不同格式，选择相应的解码器。这里有两个问题：

1. 譬如说有一段MP3的音乐，为什么不直接传输MP3，而要在外卖裹一层FLV的包装，而FLV的包装并没有实际功能。  
    如果直接下载MP3音乐，那么播放时需要启动识别MP3的播放器。直接使用MP3播放器，播放.mp3文件，比用Flash Player，播放.flv文件的效率高。因为.flv文件里实际包括的就是那个.mp3文件，丝毫不差。但是识别编码格式，选择相应解码器，这些都是中 间环节，中间环节多了，效率自然低。  
    让MP3成为音乐的标准格式，这是很多人的愿望。但是视频的标准是什么，众说纷纭，莫衷一是。不同网页使用不同的视频格式，用户浏览这些网页，需要事先下载并安装各种各样的视频播放器，烦不胜烦。  
    如果Flash Player能包含所有常用的视频播放器，那么无论用户浏览哪个网页，他只需要预先下载并安装Flash Player一套软件，就可以包打天下。更何况，反正Flash Player已经无所不在了，现在要做的，是扩充Flash Player的功能，使它能够播放更多格式的视频。
2. 既然FLV支持MPEG-4旗下所有格式，为什么林立山头，把文件后缀定为.flv，不如干脆把文件后缀定为.mpeg4好了。  
    实际上，Adobe公司的确有意向，今后取消.flv文件格式，而使用标准的.mpeg4格式。

[![The video format H.264 and audio format AAC wrapped inside FLV](https://s3.ifanr.com/wp-content/uploads/2010/08/ThevideoformatH.264andaudioformatAACwrappedinsideFLV_thumb.gif "The video format H.264 and audio format AAC wrapped inside FLV")](https://s3.ifanr.com/wp-content/uploads/2010/08/ThevideoformatH.264andaudioformatAACwrappedinsideFLV.gif)

*Figure 2. The video format H.264 and audio format AAC wrapped inside FLV*
