SWF 版本:从 Flash 1 到 Player 时代
作品页的 Flash 5 不是制作软件版本。这个数字藏在 SWF 文件头里,也串起了 Flash 格式一路长大的过程。
Flash 保存计划 · 最近整理于 2026年7月30日
本文目录 · 3 节
作品页上写着“Flash 5”或“Flash 9”,这里说的是 SWF 文件格式版本。拆开一只 SWF,这个数字就在文件头第四个字节。播放器会先看它,再决定用哪一代规则读后面的标签、字符串和脚本。
前三个字节是 FWS、CWS 或 ZWS,紧接着就是 Version:0x05 是 SWF 5,0x09 是 SWF 9。再往后,才轮到文件长度、舞台、帧率、帧数和一长串标签。
本站把这个字节原样记进 header.swf_version,页面上再写成“Flash N”。版本也会参与解析:SWF 6 起的字符串用 UTF-8;更早的中文文件,则要照顾当年的系统代码页。
四个名字常常挤在一起:SWF 版本管文件格式,Flash Player 版本管运行环境,Flash Professional、Flex 是制作工具,AVM1 / AVM2 又是脚本虚拟机。它们一路相伴,却各自回答不同的问题。
制作工具可以选择发布目标,所以新版 Flash Professional 或 Flex 也能导出较早的 SWF。ProductInfo 里若写着“Adobe Flex 3.1”,说的是谁生成了文件;文件头里的 SWF 版本,说的是它最后选择了哪套格式。
页面上的 AS2 / AS3 另看 DoAction、DoInitAction、DoABC 和 FileAttributes。本站暂时把传统 AVM1 动作都放在 AS2 这一栏,所以很早的 SWF 也可能显示 AS2;遇到这种情况,把它读成“AVM1 一代”更贴切。
一条时间线:SWF 1–20
下面挑的是每一代最容易认出的变化。SWF 1–10 与 Flash Player 主版本大体同号;到了 Player 10.1 前后,两套数字便渐渐错开了。
| SWF 版本 | 同期 Player 目标 | 这一代带来了什么 |
|---|---|---|
| SWF 1 | Flash Player 1 | 基础时间轴、形状、位图、文字和声音等早期标签;未压缩 FWS。 |
| SWF 2 | Flash Player 2 | DefineShape2 扩展形状样式数量与多样式表能力。 |
| SWF 3 | Flash Player 3 | DefineShape3 为颜色加入透明度;DefineSprite 支持独立影片剪辑时间轴;已有简单的 11 条动作模型。 |
| SWF 4 | Flash Player 4 | 动作模型加入表达式、变量、条件分支与循环;MP3 成为可识别的声音格式。 |
| SWF 5 | Flash Player 5 | 动作模型加入 JavaScript 风格对象模型、数据类型、函数及更多数学和栈操作;出现资源导出 / 导入等标签。 |
| SWF 6 | Flash Player 6 | 可使用 CWS + zlib 压缩;版本相关字符串统一为 UTF-8;加入视频、DoInitAction 和新的剪辑事件。 |
| SWF 7 | Flash Player 7 | AVM1 继续扩展,例如 ActionExtends;加入 ScriptLimits 与 SetTabIndex。 |
| SWF 8 | Flash Player 8 | FileAttributes 成为必需的首个标签;DefineShape4、滤镜、混合模式、焦点渐变和高级文字渲染扩展视觉表达。 |
| SWF 9 | Flash Player 9 | FileAttributes.ActionScript3 与 DoABC 开始承载 AVM2 / ActionScript 3;仍可发布 AVM1 文件。 |
| SWF 10 | Flash Player 10.0 | FileAttributes 增加 Direct Blit / GPU 相关能力,形状与位图继续扩展;动作模型本身没有变化。 |
| SWF 11 | Flash Player 10.2 | 编号开始与 Player 产品号错开;PlaceObject3 可记录可见性与不透明背景等新增字段。 |
| SWF 12 | Flash Player 10.3 | 对应新的运行时目标;这一阶段许多新能力转由 ActionScript API 提供。 |
| SWF 13 | Flash Player 11.0 | ZWS + LZMA 外层压缩从这一版起可用;进入 Player 11 世代。 |
| SWF 14 | Flash Player 11.1 / AIR 3.1 | 随 Player / AIR 小版本推进,主要建立运行时行为与 API 的版本边界。 |
| SWF 15 | Flash Player 11.2 / AIR 3.2 | Player / AIR 的下一发布目标。 |
| SWF 16 | Flash Player 11.3 / AIR 3.3 | Player / AIR 的下一发布目标。 |
| SWF 17 | Flash Player 11.4 / AIR 3.4 | “Player 11.4 对应 SWF 17”,两套编号的错位到这里已经很明显。 |
| SWF 18 | Flash Player 11.5 / AIR 3.5 | 继续对应运行时小版本目标。 |
| SWF 19 | Flash Player 11.6 / AIR 3.6 | Adobe 第 19 版公开 SWF 文档覆盖到这一目标;这里没有一款“Player 19”。 |
| SWF 20 | Flash Player 11.7 / AIR 3.7 | 后续目标版本之一;SWF 编号并未止于 20。 |
Flash 1–5:格式快速扩张
SWF 5 以前,标签集合长得很快。回头看这几版,几乎能看见 Flash 从线性动画容器变成可编程平台:SWF 3 的动作还是播放、停止、跳帧和打开 URL;SWF 4 有了栈式表达式、变量、分支和循环;SWF 5 又添上对象、类型与函数。当然,格式里有这套能力,不代表每只文件都会用——纯动画 SWF 5 完全可能没有 DoAction。
Flash 6–8:编码、媒体与视觉能力
SWF 6 是整理旧档时很实用的一条分界线:主体可以用 zlib 压缩,字符串转向 UTF-8,内嵌视频也登场了。SWF 7 继续补充脚本和可访问性控制。到 SWF 8,滤镜、混合、渐变、描边和字体渲染都丰富起来,FileAttributes 也固定在标签流开头。
这就是版本不能只当年代标签看的原因。同一串字节放在 SWF 5 和 SWF 6 里,字符串解码可能不同;一些记录的字段和有效位也会跟着版本变化。
Flash 9:AVM2 是一次真正的断代
SWF 9 带来 DoABC,里面装的是 ActionScript Virtual Machine 2(AVM2)读取的 ABC 字节码。FileAttributes 里的 ActionScript3 位一旦设下,播放器就走 AS3 路线,传统 DoAction / DoInitAction 会被忽略;一只 SWF 也不能混用两套脚本模型。不过作者仍可把 SWF 9 发布成 AVM1 文件,所以本站把格式版本和脚本代际分开显示。
Flash 10 与后续 SWF 版本
SWF 10 之后,新能力越来越多地出现在 ActionScript 层,文件格式的数字则像一道道运行时边界。SWF 10 的动作模型甚至没有变化。Player 10.2 对应 SWF 11,10.3 对应 SWF 12,Player 11.0 又对应 SWF 13;往后每个 Player 11.x 小版本继续推高 SWF 号。于是 SWF 14–20 的差别,常常不像早年那样一眼就是一批新标签,但播放器仍要靠它选择相应的行为和 API。
这个数字能告诉我们多少
swf_version 是制作工具留给播放器的一条起跑线。播放器会按它保留一些旧行为,但媒体 codec 和 ActionScript API 还有自己的版本条件,主文件也可能临时加载别的 SWF、字体、图片、声音或视频。只看这一个字节,算不出精确的“最低播放器”。
旧档里偶尔还能碰到不太规整的组合:转换器改过,文件被手工补过,或者单纯已经损坏,于是较低的版本头后面跟着较新的结构。Ruffle 遇到版本过低却使用压缩的文件也会提醒。真要判断能否完整播放,还得继续看标签、脚本虚拟机、媒体、外部依赖和安全沙箱。
也别指望把这个字节改小,就能让新内容回到旧播放器。标签、字节码和 codec 并没有跟着变,反而可能被按错规则读取。至于作品大小和复杂程度,版本更管不着:一帧小动画可以发布成新版本,一只庞大的游戏也可能安稳地待在 SWF 5。