SWFLoader начинает воспроизводить SWF без завершения загрузки - PullRequest
1 голос
/ 17 декабря 2009

Мне нужно воспроизводить SWF-файлы в моем проекте. Эти SWF-файлы содержат фоновую музыку. Для параметров Sound Sync этой музыки во Flash установлено значение «stream». Это сделано для того, чтобы при приостановке Flash-фильма музыка также приостанавливалась.

Теперь у меня проблема с загрузкой этих SWF-файлов. Для этого я использую SWFLoader.

Когда я загружаю его, звук SWF-файла уже начинает воспроизводиться, но в течение определенного времени никакие изображения фильма не отображаются. Чем медленнее ваше соединение, тем больше времени требуется для показа визуальных эффектов фильма. Аудио и видео синхронизированы, это хорошо, однако первые кадры флэш-фильма просто не отображаются.

Я попытался решить эту проблему, добавив eventListener, чтобы убедиться, что фильм полностью загружен, прежде чем он начнет воспроизводиться. Однако, когда я делаю это (код ниже), в течение доли секунды музыка воспроизводится, затем останавливается и перезапускается, когда фильм полностью загружен.

Как лучше всего решить эту проблему? Я на правильном пути с помощью списка событий ProgressEvent.PROGRESS?

Код:

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 Ответ

3 голосов
/ 17 декабря 2009

SWF-файл передается в потоковом режиме, поэтому он может начать воспроизведение без загрузки полного файла.

1) Вы можете добавить в загруженный исходный файл остановку () в первом кадре, чтобы избежать воспроизведения, а затем в главном загрузчике после завершения загрузки добавить вызов gotoAndPlay на фильм загружен в кадр, с которого вы хотите начать свой фильм.

2) Вы можете попытаться делегировать загрузку URLLoader, а затем использовать Loader.loadBytes, когда первый будет завершен.

Это чистый AS3, но вы можете адаптироваться к FLEX Framework, где вы используете SWFLoader:

// 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");
...