我的问题是:
发布于 2010-11-11 20:01:55
好的。.swf规范可以在这里找到:v10.pdf
FileAttributes,第60页,ActionScript3 UB1。如果设置了此位,则为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 + 2swf8是swf的第8个字节。读下一个字节,这是第5位。
如果文件被压缩(字节为0,FileLength 0x43),则可能必须在FileLength之后解压缩所有内容。swf是使用zlib压缩的,是Little Endian。
发布于 2010-11-11 19:24:09
ActionScript虚拟机2是ActionScript 3的虚拟机,AVM1是ActionScript 1和2的虚拟机,所以如果ActionScript版本是ACTIONSCRIPT2,则是AVM1,如果是ACTIONSCRIPT3,则是AVM2。
关于你的最新问题:
我不认为用C#直接读取这些信息是可能的。我想您希望在C#中包括一部SWF电影;这样基本上您就可以嵌入Flash并告诉它播放电影了。所以你和C#的电影没有直接的互动。也许可以联系Flash实例并获取信息,但我不知道有哪些信息可用(而且我认为这也取决于您如何嵌入它)。
不过,您可以使用Flash‘ExternalInterface作为通信点(我猜,您可以使用C#容器作为来自Flash的外部接口,就像您可以在网页上与JavaScript通信一样),只需“询问”电影本身它是什么版本。由于您可能正在使用一些第三方文件,您将无法访问它们的源代码,因此您可以编写一个包装器SWF来为您加载原始文件。
不管你是怎么做的,我想知道你为什么想要这些信息。当你在某个地方播放一部SWF电影时,你根本不在乎它在内部做什么。AVM版本只在与电影直接通信时起作用。
https://stackoverflow.com/questions/4158377
复制相似问题