// 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进行压缩,并且是小端序。
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 版本只有在直接与动画交互时才会有影响。