我的问题:
答案 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版本仅在直接与电影通信时才有用。