从C#中 - 是否有一种方法可以确定一个swf是AVM1还是AVM2?

3
  • ActionScript 3.0提供了一种方法来确定一个swf文件是AVM2(或更早版本)还是AVM3。[链接1链接2]

我的问题:

  • 从C#中,有没有一种方法可以确定一个swf文件是AVM1还是AVM2?
2个回答

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及以上的.swf文件,但保证版本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之后的所有内容。swf使用zlib进行压缩,并且是小端序。


1

ActionScript Virtual Machine 2 是 ActionScript 3 的虚拟机。而 AVM1 则是 ActionScript 1 和 2 的虚拟机。所以如果 ActionScript 版本是 ACTIONSCRIPT2,就是 AVM1;若是 ACTIONSCRIPT3,则是 AVM2。

关于您更新的问题:

我认为直接通过 C# 读取该信息是不可能的。我猜您是想在 C# 内嵌入 SWF 影片;这种方式基本上相当于嵌入了 Flash Player 并要求它播放影片。因此,您不能直接从 C# 与影片进行交互。或许可以联系 Flash Player 实例并获取信息,但我不知道可以获取什么样的信息(我认为这还取决于您是如何嵌入它的)。

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

无论你怎么做,我都想知道你为什么需要那个信息。当你在某个地方播放 SWF 动画时,你基本上并不关心它的内部工作原理。AVM 版本只有在直接与动画交互时才会有影响。

+1:谢谢,你对我的原始问题做出了正确的回答。//我只是稍微调整了一下。 - Jim G.

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