`
aksoft
  • 浏览: 45448 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

可以将基于AVM1Movie的SWF编码成 as3的MovieClip的类

    博客分类:
  • AS3
阅读更多
使用方法在注释中
/*
 * ForcibleLoader
 * 
 * Licensed under the MIT License
 * 
 * Copyright (c) 2007-2009 BeInteractive! (www.be-interactive.org) and
 *                         Spark project  (www.libspark.org)
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
package
{
  import flash.display.Loader;
  import flash.net.URLRequest;
  import flash.net.URLStream;
  import flash.events.IOErrorEvent;
  import flash.events.SecurityErrorEvent;
  import flash.events.Event;
  import flash.utils.ByteArray;
  import flash.utils.Endian;
  import flash.errors.EOFError;
  
  /**
   * Loads a SWF file as version 9 format forcibly even if version is under 9.
   * 
   * Usage:
   * <pre>
   * var loader:Loader = Loader(addChild(new Loader()));
   * var fLoader:ForcibleLoader = new ForcibleLoader(loader);
   * fLoader.load(new URLRequest('swf7.swf'));
   * </pre>
   * 
   * @author yossy:beinteractive
   * @see http://www.be-interactive.org/?itemid=250
   * @see http://fladdict.net/blog/2007/05/avm2avm1swf.html
   */
  public class ForcibleLoader
  {
    public function ForcibleLoader(loader:Loader)
    {
      this.loader = loader;
      
      _stream = new URLStream();
      _stream.addEventListener(Event.COMPLETE, completeHandler);
      _stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
      _stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    }
    
    private var _loader:Loader;
    private var _stream:URLStream;
    
    public function get loader():Loader
    {
      return _loader;
    }
    
    public function set loader(value:Loader):void
    {
      _loader = value;
    }
    
    public function load(request:URLRequest):void
    {
      _stream.load(request);
    }
    
    private function completeHandler(event:Event):void
    {
      var inputBytes:ByteArray = new ByteArray();
      _stream.readBytes(inputBytes);
      _stream.close();
      inputBytes.endian = Endian.LITTLE_ENDIAN;
      
      if (isCompressed(inputBytes)) {
        uncompress(inputBytes);
      }
      
      var version:uint = uint(inputBytes[3]);
      
      if (version < 9) {
        updateVersion(inputBytes, 9);
      }
      if (version > 7) {
        flagSWF9Bit(inputBytes);
      }
      else {
        insertFileAttributesTag(inputBytes);
      }
      
      loader.loadBytes(inputBytes);
    }
    
    private function isCompressed(bytes:ByteArray):Boolean
    {
      return bytes[0] == 0x43;
    }
    
    private function uncompress(bytes:ByteArray):void
    {
      var cBytes:ByteArray = new ByteArray();
      cBytes.writeBytes(bytes, 8);
      bytes.length = 8;
      bytes.position = 8;
      cBytes.uncompress();
      bytes.writeBytes(cBytes);
      bytes[0] = 0x46;
      cBytes.length = 0;
    }
    
    private function getBodyPosition(bytes:ByteArray):uint
    {
      var result:uint = 0;
      
      result += 3; // FWS/CWS
      result += 1; // version(byte)
      result += 4; // length(32bit-uint)
      
      var rectNBits:uint = bytes[result] >>> 3;
      result += (5 + rectNBits * 4) / 8; // stage(rect)
      
      result += 2;
      
      result += 1; // frameRate(byte)
      result += 2; // totalFrames(16bit-uint)
      
      return result;
    }
    
    private function findFileAttributesPosition(offset:uint, bytes:ByteArray):uint
    {
      bytes.position = offset;
      
      try {
        for (;;) {
          var byte:uint = bytes.readShort();
          var tag:uint = byte >>> 6;
          if (tag == 69) {
            return bytes.position - 2;
          }
          var length:uint = byte & 0x3f;
          if (length == 0x3f) {
            length = bytes.readInt();
          }
          bytes.position += length;
        }
      }
      catch (e:EOFError) {
      }
      
      return NaN;
    }
    
    private function flagSWF9Bit(bytes:ByteArray):void
    {
      var pos:uint = findFileAttributesPosition(getBodyPosition(bytes), bytes);
      if (!isNaN(pos)) {
        bytes[pos + 2] |= 0x08;
      }
    }
    
    private function insertFileAttributesTag(bytes:ByteArray):void
    {
      var pos:uint = getBodyPosition(bytes);
      var afterBytes:ByteArray = new ByteArray();
      afterBytes.writeBytes(bytes, pos);
      bytes.length = pos;
      bytes.position = pos;
      bytes.writeByte(0x44);
      bytes.writeByte(0x11);
      bytes.writeByte(0x08);
      bytes.writeByte(0x00);
      bytes.writeByte(0x00);
      bytes.writeByte(0x00);
      bytes.writeBytes(afterBytes);
      afterBytes.length = 0;
    }
    
    private function updateVersion(bytes:ByteArray, version:uint):void
    {
      bytes[3] = version;
    }
    
    private function ioErrorHandler(event:IOErrorEvent):void
    {
      loader.contentLoaderInfo.dispatchEvent(event.clone());
    }
    
    private function securityErrorHandler(event:SecurityErrorEvent):void
    {
      loader.contentLoaderInfo.dispatchEvent(event.clone());
    }
  }
}




转自http://www.imemment.com/post/82.html
分享到:
评论

相关推荐

    将AMV1影片转换为MovieClip

    `AVM1Movie_To_MovieClip`这个类很可能是作者为了弥补AS3原生不支持AMV1格式而编写的。这个类可能包含了读取AMV1视频数据、解码、并将每一帧转换为AS3中的BitmapData,然后利用DisplayObject容器的功能组合成...

    Avm2虚拟机浅析与as3性能优化

    相比于前一代的AVM1(主要针对AS1和AS2),AVM2在设计上有了显著改进,尤其是在性能方面。它采用了JIT(Just-In-Time)编译技术与解释器相结合的方式,这种混合执行模式极大地提高了代码执行效率。 #### JIT与解释...

    swf文件结构及avm原理

    AVM有两种版本:AVM1和AVM2,其中AVM2是更为先进的一种,支持ActionScript 3.0。 1. **AVM2架构** - **ABCLoad**:加载ABC(ActionScript ByteCode)数据到内存,并进行解析,获取所有数据单元,如Script、Class、...

    Action Script 虚拟机-AVM2 源码

    随着技术的发展,AVM经历了从AVM1到AVM2的重大升级,以支持更强大的功能和性能提升。AVM2的开源使得开发者和研究人员有机会深入理解其内部工作原理,对ActionScript的优化和自定义实现提供了无限可能。 AVM2的设计...

    自己写的简单播放avm1的swf

    综合以上信息,这个项目可能是一个使用ActionScript或相关的编程语言(如AS3,因为AS2和AS1已被AVM1支持)编写的SWF播放器。它可能利用了Flex框架,因为有`.flexProperties`和`.actionScriptProperties`文件。开发...

    flash avm2 虚拟机说明

    AVM2是Adobe Flash Player和Adobe AIR的核心组件之一,旨在执行ActionScript 3.0(AS3)代码。它不仅提供了比前代AVM更高效的性能,还引入了对现代编程语言特性的支持,如垃圾回收、类型安全和多线程。 #### 重要...

    倍加福编码器资料

    本文主要介绍的是倍加福旗下的AVM58系列多圈绝对值编码器的相关资料,特别是AVM58-H型号的特点及应用。 #### 二、AVM58-H单圈绝对值编码器特点 AVM58-H是一款单圈绝对值编码器,通过SSI(同步串行接口)输出定位数据...

    剖析SWF文件结构_探秘AVM运行原理

    剖析SWF文件结构_探秘AVM运行原理剖析SWF文件结构_探秘AVM运行原理剖析SWF文件结构_探秘AVM运行原理

    高级验证方法学(AVM)中文版

    1. **AVM组件模型**:AVM定义了一组预定义的组件模板,如Agent、Driver、Sequencer、Monitor等,这些组件可以相互协作完成验证任务。书中会解释每个组件的作用和它们之间的交互机制。 2. **接口与连接**:AVM提供了...

    Actionscript Virtual Machine(AVM2)

    AVM2 的出现是为了克服早期版本的ActionScript(如AS1和AS2)在性能和功能上的限制。 #### 二、ActionScript Virtual Machine 结构 ##### 2.1 常量值 AVM2 使用一系列预定义的常量值来帮助解释和执行脚本。这些...

    AVM.rar_AVM_PIC

    在构建AVM系统中,我们可以选择适合的型号,如PIC16或PIC18系列,它们拥有足够的输入/输出引脚和计算能力,可以处理实时的数据采集和处理任务。 三、AVM系统硬件设计 1. 电流测量:采用电流互感器或分流器来感应...

    AVM2源码.zip

    1. **字节码解析**:AVM2使用字节码作为中间表示,这使得代码可以在不同的平台上运行。字节码解析器负责将二进制的字节码转换为可执行的指令。 2. **类加载机制**:AVM2管理着类的生命周期,包括加载、链接和初始化...

    flash虚拟机源码-AVM2

    flash的虚拟机源码-AVM2 avmplus Adobe System Incorporated

    计数问题 AVM竞赛练习 C语言 基础算法

    从给定的文件信息来看,我们正在探讨的主题是“计数问题”,具体而言,这是一个与AVM(一种可能指的是Algorithm Visualization Media或者特定编程竞赛的缩写)竞赛练习相关的C语言基础算法实例。这个实例主要涉及在...

    PIAB 真空泵P6010AVM 选型册.pdf

    PIAB真空泵P6010AVM选型册介绍了PIAB公司推出的P6010AVM真空泵产品,该产品采用了专利的COAX®技术。COAX®技术是一种先进的真空产生技术,能够提供可靠的真空吸附力量和高效的气流控制,特别适合于需要大量大吸盘的...

    基于Erlang VM的语言

    - **ErlyJS**虽然没有直接展示代码,但我们可以推测其目标是将JavaScript代码转换为Erlang形式,以便在Erlang VM上运行。 【实现层面】 - **Reia**的代码首先被转换为Erlang形式,然后由Erlang编译器处理成BEAM...

    Ansible-avm.zip

    3. **测试与回滚**:AVM允许你快速切换到不同的Ansible版本,进行回归测试,如果发现问题可以方便地回滚到之前的稳定版本。 4. **自动化部署**:AVM可以与CI/CD工具集成,自动升级或降级Ansible版本,以适应开发和...

    全景影像系统(AVM)).pdf

    同时,AVM系统也可以为基于图像的汽车电子技术提供基础平台,如车道偏离预警、行人防撞、汽车外环境三维建模等等。 AVM系统的工作原理是通过四个广角摄像头采集汽车周围的图像,然后通过图像处理技术将图像合并和...

    士研电机保护继电器AVM-NB说明书.pdf

    士研电机保护继电器AVM-NB说明书pdf,士研电机保护继电器AVM-NB说明书:相位顺序不对(逆相)及电压过高或电压不足时自动跳脱保护,设定值可以从额定电压的±5%到±29%,如果电压超过或是不足,内部继电器立即回到原始...

Global site tag (gtag.js) - Google Analytics