我已经尝试了很多方法来卸载我的瑞士法郎,但无济于事,即使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并播放不同的视频,则两个音轨会互相播放。
任何指导都会一如既往地被广泛接受和赞赏。
西蒙
答案 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'函数放入其中。 我疯了。