从C# - 有没有办法确定swf是AVM1还是AVM2?

时间:2010-11-11 19:20:32

标签: c# actionscript-3 flash

  • ActionScript 3.0提供了一种确定swf是否适用于以下任何一种方法的方法:1)AVM2(或更早版本);或2)AVM3。 [link1link2]

我的问题:

  • 从C#,有没有办法确定swf是用于AVM1还是AVM2?

2 个答案:

答案 0 :(得分:6)

不确定。 .swf规范可以在这里找到: http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

FileAttributes,第60页,ActionScript3 UB [1]。如果设置此位则为AVM2,否则为AVM1。这仅适用于版本9及更高版本的.swfs,但版本8或更低版本保证为AVM1。

快速找到这一点:

// Bytes from start of file: Signature + Version + FileLength + FrameSize + FrameRate + FrameCount + FileAttributes Header 
3 + 1 + 4 + (ceil(((swf[8] >> 3) * 4 - 3) / 8) + 1) + 2 + 2 + 2

swf [8]是swf的第8个字节。读取下一个字节,它是第5位。

如果文件被压缩(字节0 == 0x43),您可能必须在FileLength之后解压缩所有内容。使用zlib压缩swf并且是Little Endian。

答案 1 :(得分:1)

ActionScript虚拟机2 是ActionScript 3的虚拟机。 AVM1 是ActionScript 1和2的虚拟机。因此,如果ActionScript版本为{{ 1}}它是AVM1,如果它是ACTIONSCRIPT2它是AVM2。

关于您更新的问题:

我认为不可能直接用C#读出这些信息。我想你想在C#中包含一个SWF电影;那样你基本上只是嵌入Flash Player并告诉它播放电影。所以你没有与C#的电影直接互动。有可能联系Flash Player实例并获取信息,但我不知道可用的信息类型(我认为这也取决于你如何嵌入它)。

然而,您可以使用Flash的ExternalInterface作为通信点(我猜,您可以使用C#容器作为Flash的外部接口,就像您可以在网页上与JavaScript通信一样)并简单地“询问”电影本身它是什么版本。由于您可能正在使用某些第三方文件,因此您无法访问其源代码,因此您可以编写一个包装SWF,而不是为您加载原始文件。

无论你怎么做,我都想知道你为什么要这些信息。当你在某个地方播放SWF电影时,你基本上不在乎它在内部做什么。 AVM版本仅在直接与电影通信时才有用。