【问题标题】:Flash/AS3 - preload or stream embedded soundsFlash/AS3 - 预加载或流式传输嵌入的声音
【发布时间】:2013-07-14 22:45:20
【问题描述】:

我目前正在从事 flashdevelop 的一个项目,我想加入一些音乐。我正在构建游戏,因此不能选择多个文件。目前所有资源都是嵌入的,一个简单的预加载器加载所有内容(如 flashdevelop 默认预加载器)。 我不想在一开始就加载音乐,我想在需要时流式传输它。

是否可以流式传输嵌入的声音? 如果没有,是否可以将这些文件嵌入到 .swf 文件中并稍后加载?

提前致谢!

【问题讨论】:

    标签: actionscript-3 flash audio stream preload


    【解决方案1】:

    你可以做两件事。一种是在初始加载完成后开始加载声音并将它们保存在Dictionary 中。其次是从 Flash 导出 RSL(运行时共享库​​),这是一个 SWF 文件,您可以加载并访问其中定义的所有类。

    在第一种方法中,您基本上像这样加载每个声音并将它们保存到字典中:

    import flash.media.Sound;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.utils.Dictionary;
    
    var mSounds:Dictionary = new Dictionary();
    
    function loadSound(url:String, soundName:String)
    {
        var sound:Sound = new Sound();
        sound.addEventListener(Event.COMPLETE, onSoundLoadComplete);
        sound.load(new URLRequest(url));
    
        function onSoundLoadComplete(e:Event):void
        {
            sound.removeEventListener(Event.COMPLETE, onSoundLoadComplete);
            trace(soundName,"Sound Loaded");
    
            mSounds[soundName] = sound; // save it to dictionary
    
            // then you can load it from dictionary 
            // using the name you assigned
            if(mSounds["crystalised"])
                (mSounds["crystalised"] as Sound).play();
        }
    }
    
    
    loadSound("C:\\Users\\Gio\\Desktop\\Crystalised.mp3", "crystalised");
    

    在第二种方法中,您必须执行更多步骤,但您只需加载一次。我将在此处列出步骤:

    1. 制作新的 Flash 文档 (FLA)
    2. 将您需要的所有声音导入到库中
    3. 在每个声音的属性菜单中选择 Actionscript 选项卡并勾选 Export for Runtime Sharing 复选框并填写输出 SWF 的名称
    4. 发布此 FLA 后,您可以将其加载到您的应用程序或游戏中并像这样使用它:

      import flash.display.Loader;
      import flash.system.LoaderContext;
      import flash.system.ApplicationDomain;
      import flash.system.SecurityDomain;
      import flash.events.Event;
      import flash.net.URLRequest;
      import flash.media.Sound;
      import flash.utils.getDefinitionByName;
      
      function loadRSL(url:String):void
      {
          var loader:Loader = new Loader();
          var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
      
          loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onRSLLoadComplete);
          loader.load(new URLRequest(url), context);
      
          function onRSLLoadComplete(e:Event):void
          {
              loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onRSLLoadComplete);
              trace("RSL Loaded");
      
              // creating a new instance of the sound which is defined in RSL
              var soundClass:Class = getDefinitionByName("Crystalised") as Class;
              var sound:Sound = (new soundClass() as Sound);
              sound.play();
          }
      }
      
      loadRSL("SoundLibrary.swf");
      

    【讨论】:

    • 感谢您的清晰解释!似乎这不能用单个 SWF 完成?
    • 没有。这些是我知道的唯一方法。如果您将所有内容放在一个 SWF 中,它将同时加载,因为它是在网页上加载的一个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多