使用unloadAndStop()方法卸载swf,但视频声音仍然可以听到

时间:2011-02-16 08:06:35

标签: flash actionscript-3 actionscript flash-cs4

我已经尝试了很多方法来卸载我的瑞士法郎,但无济于事,即使swf已经加载,我的拉片swf中的视频声音也会继续播放。

我创建了一个通用加载器,如下所示:

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并播放不同的视频,则两个音轨会互相播放。

任何指导都会一如既往地被广泛接受和赞赏。

西蒙

4 个答案:

答案 0 :(得分:2)

处理此问题的适当方法是将destroy函数编程到任何已加载的内容中,然后在卸载该内容之前调用它。在destroy函数中,加载的swf应该负责自己的业务......

  • 停止播放声音。
  • 关闭所有开放的视频流(如流媒体视频)。
  • 在时间轴上呼叫停止
  • 等...

SoundMixer.stopAll()绝不是一个合适的解决方案。相反,如果你是将“可接受”的参数设置为不和谐的用户体验,那么可能就是这样,但如果你正在编写要加载到别人的应用程序中的第三方swf,你肯定会负责任为了清理你自己的声音混乱,SoundMixer不仅会杀死你的声音,还会杀死来自装载机的声音,这是激怒你的主人的一种肯定的方式。

答案 1 :(得分:1)

经过大量研究后,我解决了这个问题。希望这会让某人的生活变得更轻松,这就是问题所在:

unloadAndStop();方法从加载的SWF中删除任何事件侦听器,实例,对象等。在我的情况下,我有视频,如果视频在用户退出时仍在播放(并且加载的内容已卸载),声音将继续播放。似乎unloadAndStop();函数没有做的一件事是停止所有声音。

解决方案?我将一个事件监听器附加到我的加载器,在内容成功卸载后,我调用了SoundMixer.stopAll();函数,确保播放时没有声音!然而,这意味着如果你一直有环境背景声音,它们也会停止。您可以更进一步获取环境声音的当前时间,并从该时间点立即“重新启动”它们。

我的简单发泄听众看起来像这样:

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

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

我相信这会对某人有所帮助!这有点“hacky”,但它的工作做得很好。

亲切的问候, 西蒙

答案 2 :(得分:1)

在你的video.swf中,你必须写下这样的内容:

this.addEventListener(Event.REMOVED_FROM_STAGE, stopSound)

function stopSound(e:Event):void
{
    my_flvPlayer.stop();
}

答案 3 :(得分:0)

监听Event.UNLOAD然后调用拉出'SoundMixer.stopAll()'函数的函数的eventlistener是一个不错的解决方法。如果您从另一个域加载swf而不是容器swf所在的域,则这不起作用。我很确定它会触发沙箱违规。 我没有解决方案 - 无论如何最好的解决方案是上面提到的,由scriptocalypse提到。

但是我处在不同域的情况下我无法控制SWF文件 - 因此我无法将'destroy'函数放入其中。 我疯了。