SWFLoader开始播放SWF而不加载完成

时间:2009-12-17 13:46:37

标签: flex swfloader

我需要在项目中播放SWF文件。这些SWF文件中包含背景音乐。 Flash中此音乐的声音同步选项设置为“流”。这样做是为了让你暂停Flash电影,音乐也会暂停。

现在我在加载这些SWF文件时遇到问题。为此,我使用的是SWFLoader。

当我加载它时,SWF的音频已经开始播放,但是在一段时间内没有显示电影的视觉效果。连接速度越慢,显示电影的视觉效果所需的时间越长。 音频和视频是同步的,这很好,但是,闪光电影的第一帧根本不显示。

我试图通过添加一个eventListener来解决这个问题,以确保在开始播放之前电影已完全加载。但是,当我这样做时(下面的代码),音乐播放几分之一秒,然后停止,并在电影完全加载时重新开始。

解决此问题的最佳方法是什么?我是否正在使用ProgressEvent.PROGRESS eventlistener?

一些代码:

private function loadSWF():void
{
    swfLoader.source = source;
    swfLoader.addEventListener(ProgressEvent.PROGRESS, loadProgress);
    swfLoader.addEventListener(Event.COMPLETE, startSWF);
    swfLoader.load();
    var soundTransform:SoundTransform = new SoundTransform(0);
    swfLoader.soundTransform = soundTransform;
}

private function loadProgress(event:ProgressEvent):void
{
    applicationModel.addToConsoleOutput("SWFPlayer.loadProgress(): " + event.bytesLoaded + " of " + event.bytesTotal + "bytes loaded");
    if (MovieClip(swfLoader.content) && event.bytesLoaded < event.bytesTotal)
    {
        MovieClip(swfLoader.content).gotoAndStop(0);
        var soundTransform:SoundTransform = new SoundTransform(0);
        swfLoader.soundTransform = soundTransform;
    }
}

private function startSWF(event:Event):void
{
    swfLoader.removeEventListener(ProgressEvent.PROGRESS, loadProgress);
    swfLoader.removeEventListener(Event.COMPLETE, startSWF);
    dispatchEvent(new Event("loadComplete", true));

    var soundTransform:SoundTransform = new SoundTransform(volume);
    swfLoader.soundTransform = soundTransform;

    cardMovieClip = MovieClip(swfLoader.content);
    cardMovieClip.addEventListener(Event.ENTER_FRAME, endSWFHandler);
    cardMovieClip.gotoAndPlay(0);
}

1 个答案:

答案 0 :(得分:3)

流式传输SWF文件,因此无需加载完整文件即可开始播放。

1)您可以在加载的源文件中添加第一帧的stop()以避免播放,然后在加载完成后在主加载器中添加对gotoAndPlay的调用电影加载到您希望电影开始的帧。

2)您可以尝试将加载委托给URLLoader,然后在第一个加载完成后使用Loader.loadBytes。

这是纯粹的AS3,但您可以使用SWFLoader来适应FLEX Framework:

// child who hold the stuff to be loaded
var holder:MovieClip=new MovieClip();
addChild(holder);

// the loader used to load byte within the holder
var holderLdr:Loader=new Loader();
holder.addChild(holderLdr);


function load(url:String):void {
 var ldr:URLLoader=new URLLoader();
 ldr.dataFormat=URLLoaderDataFormat.BINARY;
 ldr.addEventListener(Event.COMPLETE, onComplete);
 ldr.load(new URLRequest(url));
}

function onComplete(e:Event):void {
    var ldr:URLLoader=URLLoader(e.target);

    ldr.removeEventListener(e.type, onComplete);

    if (holderLdr.hasOwnProperty("unloadAndStop")){
        holderLdr["unloadAndStop"]();
    } else {
        holderLdr.unload();
    }
    holderLdr.loadBytes(ldr.data);
    ldr.data=null;
}

load("mySWF.swf");