我该如何确定一个swf文件是针对哪个Flash Player版本发布的?

35

我有一个来源未知的SWF文件,需要知道它最初发布时所针对的Flash播放器版本。如何获取这些信息?

6个回答

40

SWF文件的第四个字节是版本号,例如0A表示Flash Player 10。

编辑:由于此问题引起了高度关注,我决定提供更多反馈。

  • 第一个字节:'F'(未压缩)或'C'(经过zlib压缩)。
  • 第二个字节:始终为'W'。
  • 第三个字节:始终为'S'。
  • 第四个字节:版本号(09表示该文件面向Flash Player 9等)。
  • 第五个到第八个字节:文件的总长度(以字节为单位)。

3
谢谢,看起来是Flash Player 10。我如何区分10和10.1?http://www.johndierks.com/img/flashversionhexdump.png - John
4
SWF文件本身并不针对特定版本的Flash Player。 - Ken D
如我下面所发的,这会告诉你你的文件遵循的SWF规范版本,但不告诉你所需的最低Flash播放器版本。 - brian sharon
@LordCover 你好,请告诉我这个符号代表哪个版本 - 'FWSh ˆ Uð   (É @ 3Y ',因为我无法理解它。 - Harsh Baid
我认为你试图进行实验的文件已经损坏或者存在某种混淆,因为通常第四个字节是09、0A或0B(即版本号)。 - Ken D

13

Flex SDK 包含一个名为 swfdump 的工具,它显示 SWF 文件中的所有元数据。这是当我运行“swfdump foo.swf”时输出的开头:

<swf xmlns='http://macromedia/2003/swfx' version='9' framerate='24' size='10000x7500' compressed='true'>

12

这是对brian sharon所说的内容的补充。

确实,现在已经不存在swf版本和Flash Player版本之间的1对1映射关系。

第四个字节表示的是-swf-version,它的好处是现在点发布版本与一个版本有了一对一的关系。

请看这些参考资料:
http://blogs.adobe.com/airodynamics/2011/08/16/versioning-in-flash-runtime-swf-version/
http://sleepydesign.blogspot.in/2012/04/flash-swf-version-meaning.html

来自第二个链接:

Compiler Option     Flash Player Version
-swf-version=9      9
-swf-version=10     10, 10.1
-swf-version=11     10.2
-swf-version=12     10.3
-swf-version=13     11.0
-swf-version=14     11.1
-swf-version=15     11.2
-swf-version=16     11.3

我正在使用来自Flash游戏文件的信息,在我的Flash游戏门户网站上向用户发出警告,提示他们的Flash播放器可能已过时。这很有效。


5
大多数 - 或者说全部? - 迄今为止的答案都是不正确的,这很不幸,因为我希望能找到这个问题的答案 :).
SWF 的第 4 个字节指示了 SWF 使用的文件格式版本。这与目标播放器版本不同。
最小播放器版本是通过编译器选项 target-player 在编译时设置的,而 SWF 文件格式版本是通过选项 swf-version 设置的。
这些选项的默认值可以在 FLEX_SDK/frameworks/flex-config.xml 中找到。对于我使用的 SDK 版本(4.5.1),默认值如下:
    <!-- Specifies the minimum player version that will run the compiled SWF. -->
   <target-player>10.2.0</target-player>

    <!-- Specifies the version of the compiled SWF -->
    <swf-version>11</swf-version>

这意味着我的SWF在swfversion.com上显示为11,即使我只需要用户拥有10.2。根据http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7a92.html,Flex 4.6将target-player设置为11.1并将swf-version设置为14。因此,我不清楚swfversion.com如何有任何用处。

1
你能否交叉参考Adobe发布的规范来支持其他答案是“错误”的说法?我的理解是第4个字节仍然适用,但现在SWF版本和Flash Player版本之间的转换不再是一对一的,因为现在有了小版本。尽管如此,它仍然成立,即你无法检测到点发布。 - mpdonadio
1
假设您是正确的,有没有办法找出 SWF 文件针对哪个 Flash Player 版本? - Hayri Uğur Koltuk
1
@MPD Brian是正确的,详细信息请看我的回答,这里是你想要的Adobe参考链接 - http://blogs.adobe.com/airodynamics/2011/08/16/versioning-in-flash-runtime-swf-version/ - danishgoel
1
@AliVeli - 是的,现在有一种方法,而且它现在甚至更好了,你可以知道它是针对哪个点发布版本的,看看我的答案。 - danishgoel
我完全确信Adobe Flash很糟糕...在18版本以下getstacktrace无法工作,我们在GUI中无法获得堆栈跟踪..太棒了。 - anshulkatta

4

2

请查看http://www.adobe.com/devnet/swf.html中的SWF规范。

然后进行十六进制转储或打开能够显示十六进制的编辑器来打开SWF文件。 SWF版本是前几个字节之一,在压缩数据开始之前。 我想说它是第4个字节,但我不完全记得。 值是版本号。 如果我没记错,小数版本号未编码在SWF中。

GNU文件也可以告诉您。 尽管如此,我可能已经编辑了我的规则。


关于点版本的快速说明。Adobe在Flash Player中进行了一些相当重大的更改(例如,在9.0.115版本中增加了H.264支持)。当您将SWF添加到页面时,确实应该使用swfobject并指定点版本,以确保用户拥有正确的播放器(如果可能的话,还应提供ExpressInstall)。从未知的SWF文件中确定最低点版本需要通过与adobe.com上存档的所有Flash Player的试错以及对要查找的内容的了解。 - mpdonadio
这个过程有什么技巧吗?现在只知道完整的版本号就足够了,但我很想听听这个过程是如何运作的。 - John
你需要查看点版本的发布说明,寻找新功能或不工作的事项。然后你猜测这些功能是否被使用。有些是显而易见的(比如H.264支持),而其他一些则更加微妙。你也可以安装Flash Player的调试版本,这样可以让你看到任何异常情况。通常在调用堆栈中可以看到功能请求。 - mpdonadio
就像我之前发布的内容一样,这会告诉您您的文件遵循的SWF规范版本,但不会告诉您所需的最低Flash播放器版本。 - brian sharon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接