【问题标题】:Unloading swf using the unloadAndStop() method, but video sounds remain audible使用 unloadAndStop() 方法卸载 swf,但仍然可以听到视频声音
【发布时间】:2011-06-28 04:31:52
【问题描述】:

我尝试了很多方法来卸载我的 swf,但无济于事,即使加载了 swf,我的 laoded 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上的方法如下:

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

一如既往地接受和赞赏任何指导。

西蒙

【问题讨论】:

    标签: flash actionscript-3 actionscript flash-cs4


    【解决方案1】:

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

    • 停止播放声音。
    • 关闭所有打开的流(如流式视频)。
    • 在其时间线上调用 stop
    • 等等……

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

    【讨论】:

    • +1 表示正确。不幸的是,unload() 和 unloadAndStop() 不适用于 ActionScript 创建的任何内容。你总是需要清理你的代码,否则你会膨胀内存使用,迟早会遇到奇怪的故障,因为僵尸代码仍在隐藏在你的程序中的某个地方运行。
    • @scriptocalypse 非常感谢您的回复。由于这不是供第三方使用并且永远不会集成到另一个 Flash 应用程序中,所以我不太担心使用 SoundMixer.stopAll();功能。在您的观点上,RE 有一个破坏功能。如何从加载器本身定位加载的 swf 内的视频?这在很大程度上是我最大的挑战,因此我采用了 SoundMixer 选项。谢谢。
    • @weltraumpirat - 引用:“unload() 和 unloadAndStop() 不适用于 ActionScript 创建的任何内容”。这是不真实的。 unload() 不会,它只是删除加载的实例,但 unloadAndStop() 的设计目的正是为了清理由 actionscript 创建的“大多数”事物(事件、侦听器等)。
    • @webfac:我的经验是 unloadAndStop() 至少是不可靠的,如果没有缺陷的话。只是谷歌“卸载和停止不工作”,你会发现大量的论坛帖子有类似的问题。它可能是为了做这些事情,它可能适用于简单的程序,但这不是我会选择拥有自己的 destroy() 方法的解决方案。
    • @webfac 销毁函数将被声明为加载的 swf 的成员。为了在加载的 swf 上调用函数,您可以通过调用 loader.content.destroy(); 或将 loader.content 存储在 swf 的局部变量中进​​行加载并从那里调用 destroy。
    【解决方案2】:

    经过大量研究,我已经解决了这个问题。希望这会让某人的生活更轻松,这里有一个问题:

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

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

    我的简单发泄监听器如下所示:

    myloader.contentLoaderInfo.addEventListener(Event.UNLOAD, cleanUp);
    
    function cleanUp(e:Event):void{
       SoundMixer.stopAll(); //stop all sounds...
    }
    

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

    亲切的问候, 西蒙

    【讨论】:

    • 很高兴看到这是否已向 Adob​​e 报告了错误。
    【解决方案3】:

    在您的video.swf 中,您必须这样写:

    this.addEventListener(Event.REMOVED_FROM_STAGE, stopSound)
    
    function stopSound(e:Event):void
    {
        my_flvPlayer.stop();
    }
    

    【讨论】:

      【解决方案4】:

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

      但我处于不同域的情况,我无法控制 SWF 文件 - 所以我无法将“销毁”功能放入其中。 我要疯了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 2013-09-15
        相关资源
        最近更新 更多