2011-02-16 36 views
1

我已經嘗試了很多方法來卸載我的瑞士法郎,但無濟於事,視頻聽起來在我的瑞士法郎甚至一次瑞士法郎加載後仍然播放。使用unloadAndStop()方法卸載瑞士法郎,但視頻聲音仍然可聞​​

我創建了一個通用的裝載機如下:

var loader:Loader = new Loader(); 

我然後加載不同的swf的到名爲mov_contentLoader影片剪輯,例如視頻SWF加載如下:

loader.load(new URLRequest("video.swf")); //assign SWF url to loader 
mov_contentLoader.addChild(loader); //add loaded content to movi clip 

然後我有一個通用的「退出」按鈕,基於應用程序的狀態,某些窗口關閉,swf被卸載等。對於我的video.swf文件,當單擊退出按鈕時,我調用unloadAndStop();在裝載機上的方法如下:

loader.unloadAndStop(); //unload all content, do some garbage cleanup 
mov_contentLoader.removeChildAt(0); //just to be safe, a second layer of reassurance ?? 

SWF被卸載,但對於我的生活,我無法讓聲音停下來!我甚至採取了在video.swf上添加舞臺監聽器來監聽退出狀態,但仍然沒有停止視頻的聲音。

如果我再次加載video.swf並播放不同的視頻,則兩個音軌會相互播放。

一如既往的任何指導都被廣泛接受和讚賞。

Simon Simon

回答

1

經過大量研究,我已經解決了這個問題。希望這會讓別人的生活變得更容易,這裏是問題:

unloadAndStop();方法從加載的SWF中刪除任何事件偵聽器,實例,對象等。在我的情況下,我有視頻,如果視頻仍在播放,當用戶退出(並加載卸載的內容)的聲音將繼續。看起來unloadAndStop();函數不做的一件事是停止所有聲音。

解決方案?我將一個事件監聽器附加到我的加載程序,並且在內容成功卸載後,我調用SoundMixer.stopAll();函數,以確保沒有任何聲音在播放!但是這意味着如果你一直有環境背景聲音,他們也會停下來。你可以走得更遠,並獲得環境聲音的當前時間,並在此時立即「重新啓動」它們。

我的簡單發泄監聽器看起來是這樣的:

myloader.contentLoaderInfo.addEventListener(Event.UNLOAD, cleanUp); 

function cleanUp(e:Event):void{ 
    SoundMixer.stopAll(); //stop all sounds... 
} 

我相信這將幫助別人!這有點「哈克」,但它做得很好。

親切的問候, 西蒙

+0

會很高興地看到,如果這是報告的bug給Adobe。 – 2011-12-12 14:38:19

2

適當的方法來處理這是一個編程功能破壞到你擁有的任何加載的內容,然後調用它,你卸載該內容之前。在銷燬功能中,加載的swf應該爲自己的業務負責...

  • 停止播放聲音。
  • 關閉任何開放流(如流式視頻)。
  • 其時間表
  • 等呼籲停止...

SoundMixer.stopAll()不以任何方式合適的解決方案。相反,如果你是將「可接受」的參數設置爲令人不快的用戶體驗的參數,但是如果你正在編寫要加載到別人應用程序中的第三方swf,那麼你肯定會負責爲了清理你自己的聲音混亂,SoundMixer不僅會殺死你的聲音,還會從加載器中發出聲音,這是激怒你的主機的一種可靠的方法。

+0

+1是正確的。不幸的是,unload()和unloadAndStop()不適用於ActionScript創建的任何內容。你將永遠需要照顧清理你的代碼,否則你會臃腫的內存使用情況,遲早會遇到怪異的故障,因爲殭屍代碼仍然運行在你的程序隱藏的某個地方。 – weltraumpirat 2011-02-16 15:19:06

0

偵聽Event.UNLOAD,然後調用拖出'SoundMixer.stopAll()'函數的函數的eventlistener是一個體面的解決方法。如果您從另一個域中(而不是您的容器swf所在的域)加載swf,則這不起作用。我很確定它會觸發沙箱侵害。 我沒有解決方案 - 無論如何,最好的解決方案就是上面提到的腳本分析。

但是我處於一種情況,我處於不同的域,我無法控制SWF文件 - 所以我不能把'銷燬'功能放入它們中。 我要瘋了。

1

在你video.swf,你必須寫這樣的事:

this.addEventListener(Event.REMOVED_FROM_STAGE, stopSound) 

function stopSound(e:Event):void 
{ 
    my_flvPlayer.stop(); 
} 
相關問題