2009-12-17 5 views
1

J'ai besoin de lire des fichiers SWF dans mon projet. Ces fichiers SWF contiennent de la musique de fond. Les options Sound Sync de cette musique dans Flash sont définies sur "stream". Ceci est fait de sorte que si vous mettez en pause le film Flash, la musique sera également mise en pause.SWFLoader commence à jouer SWF sans que le chargement soit terminé

Maintenant, j'ai un problème lorsque je charge ces fichiers SWF. Pour cela, j'utilise un SWFLoader.

Lorsque je le charge, l'audio du fichier SWF commence déjà à être lu, mais aucun visuel du film n'est affiché pendant un certain temps. Plus la connexion est lente, plus la durée d'affichage des visuels du film est longue. Les sons et les images sont synchronisés, ce qui est bien, mais les premières images du film flash ne sont tout simplement pas affichées.

J'ai essayé de résoudre ce problème en ajoutant un eventListener pour m'assurer que le film est complètement chargé avant qu'il ne commence à jouer. Cependant, quand je fais cela (code ci-dessous), pendant une fraction de seconde la musique joue, puis s'arrête et redémarre lorsque le film est complètement chargé.

Quelle est la meilleure façon de résoudre ce problème? Suis-je sur la bonne voie avec l'eventlistener de ProgressEvent.PROGRESS?

Certains code:

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); 
} 

Répondre

3

fichier SWF sont transmis en continu afin qu'ils puissent commencer à jouer sans avoir à charger le fichier complet.

1) Vous pouvez ajouter dans votre source chargée fichier une butée() sur la première image pour éviter le jeu, puis dans votre chargeur principal lorsque la charge est complète ajouter un appel à GotoAndPlay sur le film chargé de le cadre dont vous voulez que votre film commence.

2) Vous pouvez essayer de déléguer le chargement à un chargeur d'URL, puis d'utiliser un Loader.loadBytes lorsque le premier est terminé.

C'est AS3 pur, mais vous pouvez adapter pour Flex Framework où vous utilisez un 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

Ok, qui semble fonctionner OK et est une bonne solution. Merci pour cela, je vais implémenter cela dans les FLAs que j'ai jusqu'ici. Cependant, la plupart du contenu SWF est fourni par plusieurs fournisseurs de contenu différents. Donc, si cela est possible, je préférerais le traiter complètement dans l'application Flex, plutôt que d'avoir les fournisseurs pour mettre cela dans le code comme je le ferai, plutôt que d'avoir moins de contrôle sur celui-ci. Donc, s'il y a une solution Flex, s'il vous plaît aider;) – Bocaxica

+0

je modifier ma réponse avec une autre façon de procéder – Patrick

+0

Salut Patrick, j'ai mis en œuvre le URLLoader et loadBytes() comme vous le suggérez ci-dessus, mais maintenant je ne peux pas appeler toutes les fonctions à l'intérieur du MovieClip qui a été chargé, ni je peux définir la hauteur et la largeur du MovieClip. Savez-vous si je peux encore le faire et comment? – Bocaxica

Questions connexes