2009-12-17 43 views
1

我需要在我的項目中播放SWF文件。這些SWF文件中有背景音樂。 Flash中該音樂的聲音同步選項設置爲「流」。這樣做是爲了如果您暫停Flash電影,音樂也會暫停。SWFLoader開始播放SWF而沒有加載完成

現在我在加載這些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); 
} 

回答

3

SWF文件的流這樣他們就可以開始播放而無需加載完整的文件。

1)您可以在第一幀添加一個stop()函數以避免播放,然後在加載完成時在主加載器中添加一個對gotoAndPlay的調用,你想要你的電影的框架從哪裏開始。

2)您可以嘗試將加載委託給URLLoader,然後在第一個完成時使用Loader.loadBytes。

這是純粹的AS3,但你可以爲Flex框架適應,你正在使用的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

相關問題