代码之家  ›  专栏  ›  技术社区  ›  Jim G.

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

  •  3
  • Jim G.  · 技术社区  · 14 年前
    • ActionScript 3.0提供了一种方法来确定swf是否用于:1)AVM2(或更早版本);或2)AVM3。[ link1 , link2 ]

    我的问题是:

    • 来自C# ,是否有方法确定swf是AVM1还是AVM2?
    2 回复  |  直到 14 年前
        1
  •  6
  •   Joony s3rro    14 年前

    当然。.swf规范可在以下位置找到: http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

    文件属性,第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),则可能必须解压缩文件长度之后的所有内容。swf是使用zlib压缩的,是小Endian。

        2
  •  1
  •   poke    14 年前

    这个 ActionScript虚拟机2 是ActionScript3的虚拟机。 平均值1 是ActionScript1和2的虚拟机。所以如果ActionScript版本是 ACTIONSCRIPT2 是AVM1,如果是 ACTIONSCRIPT3 是AVM2。

    关于你的最新问题:

    我不认为用C#直接读出这些信息是可能的。我想你应该在C里面放一部SWF电影,这样你就可以嵌入Flash播放器,让它播放电影。所以你不能直接和C#的电影互动。可能可以联系Flash Player实例并获取信息,但我不知道有什么样的信息可用(我认为这还取决于您如何嵌入它)。

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

    不管你怎么做,我想知道你为什么想要这些信息。当你在某处播放一部SWF电影时,你根本不在乎它的内在功能。AVM版本仅在与电影直接通信时才重要。