2009-12-17 5 views
1

Мне нужно воспроизвести SWF-файлы в моем проекте. В этих SWF-файлах есть фоновая музыка. Параметры звуковой синхронизации этой музыки во Flash установлены на «stream». Это делается так, что если вы приостановите Flash-ролик, музыка также приостановится.SWFLoader начинает воспроизведение SWF без завершения загрузки

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

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

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

Каков наилучший способ решить эту проблему? Я нахожусь на правильном пути с помощью EventEvent.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); 
} 

ответ

3

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"); 
+0

Хорошо, что, кажется, работает нормально и является хорошим решением. Спасибо за это, я буду реализовывать это в FLA, который у меня есть до сих пор. Однако большая часть содержимого SWF предоставляется несколькими поставщиками контента. Поэтому, если это возможно, я бы скорее обработал его в приложении Flex полностью, вместо того, чтобы провайдеры могли помещать это в код, как я буду, чем иметь меньше контроля над ним. Так что, если есть решение Flex, пожалуйста, помогите;) – Bocaxica

+0

я должен изменить свой ответ с другим способом, чтобы продолжить – Patrick

+0

Привет Патрика, я реализовал URLLoader и loadBytes(), как вы предложили выше, однако сейчас я не могу назвать любые функции внутри загруженного MovieClip, и я не могу установить высоту и ширину MovieClip. Вы знаете, могу ли я все еще это сделать и как? – Bocaxica

Смежные вопросы