【问题标题】:Flex Mobile 4.6 StageVideo not removing from stageFlex Mobile 4.6 StageVideo 未从舞台上移除
【发布时间】:2012-09-03 02:06:05
【问题描述】:

当我使用 stage.stageVideos[0] 实例化一个新的 StageVideo 实例时,一切正常,但是当我离开显示视频的视图时,它会粘在舞台上。因此,当我转到另一个视图时,它仍然在后台显示在舞台上。我尝试设置 sv = null,删除事件侦听器......等等。 我创建了一个 StageVideoDisplay 类,它在 mxml 中实例化,例如:在视图初始化时我调用 play() 方法:

if ( _path )
        {
            //... 
            // Connections 
            _nc = new NetConnection(); 
            _nc.connect(null); 
            _ns = new NetStream(_nc); 
            _ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
            _ns.client = this; 

            // Screen 
            _video = new Video(); 
            _video.smoothing = true;  

            // Video Events 
            // the StageVideoEvent.STAGE_VIDEO_STATE informs you whether 
            // StageVideo is available 
            stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, 
                onStageVideoState); 
            // in case of fallback to Video, listen to the VideoEvent.RENDER_STATE 
            // event to handle resize properly and know about the acceleration mode running 
            _video.addEventListener(VideoEvent.RENDER_STATE, videoStateChange); 
            //... 
        }

视频舞台活动:

if ( stageVideoInUse ) {
            try {
                _rc = new Rectangle(0,0,this.width,this.height);
                _sv.viewPort = _rc;       
            } catch (e:Error) {}
        } else {
            try {
                _video.width = this.width;
                _video.height = this.height;
            } catch (e:Error) {}
        }

以及舞台视频可用性活动:

protected function toggleStageVideo(on:Boolean):void 
    {     
        // To choose StageVideo attach the NetStream to StageVideo 
        if (on) 
        { 
            stageVideoInUse = true; 
            if ( _sv == null ) 
            { 
                try {
                    _sv = stage.stageVideos[0]; 
                    _sv.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange); 
                    _sv.attachNetStream(_ns); 
                    _sv.depth = 1;
                } catch (e:Error) {}
            } 

            if (classicVideoInUse) 
            { 
                // If you use StageVideo, remove from the display list the 
                // Video object to avoid covering the StageVideo object 
                // (which is always in the background) 
                stage.removeChild ( _video ); 
                classicVideoInUse = false; 
            } 
        } else 
        { 
            // Otherwise attach it to a Video object 
            if (stageVideoInUse) 
                stageVideoInUse = false; 
            classicVideoInUse = true; 
            try {
                _video.attachNetStream(_ns); 
                stage.addChildAt(_video, 0); 
            } catch (e:Error) {}
        } 

        if ( !played ) 
        { 
            played = true; 
            _ns.play(path); 
        } 
    } 

当我 navigator.popView() 时,视图中会发生什么情况,stageVideo 仍保留在舞台上,即使在其他视图中也是如此,并且当返回该视图以播放不同的流时,相同的流有点“烧毁”了最佳。我想不出办法摆脱它!提前致谢!

【问题讨论】:

    标签: apache-flex air flex4


    【解决方案1】:

    在 Flash Player 11 中,Adobe 将 dispose() 方法添加到 NetStream 类。

    这对于在完成后清除 VideoStageVideo 对象很有用。

    当您在运行时调用dispose() 方法时,您可能会得到一个异常,指出NetStream 对象上没有名为dispose 的属性。

    这是因为 Flash Builder 没有使用正确的 SWF 版本编译应用程序。要解决这个问题,只需将其添加到您的编译器指令中:

    -swf-version=13

    在新的 Flash Builder 4.7 中,我们希望不必指定 SWF 版本即可使用更新的 Flash Player 功能。

    这似乎是最好的解决方案,但如果您不能使用 Flash 11(或最新的 Adob​​e AIR),其他一些解决方法是:

    • 将舞台视频对象的viewPort 设置为宽度=0 且高度=0 的矩形
    • 由于舞台视频出现在您的应用下方,您可以随时覆盖视口(使用背景颜色或一些DisplayObject

    【讨论】:

    • 谢谢。不幸的是,这似乎没有做任何事情。离开视图时,它似乎确实有助于视频不在后台播放。但是,当转到另一个视图时,stageVideo 仍然存在于舞台上。此外,当移动到同一个视图并尝试播放另一个视频时,同一个视频仍然在舞台上处于暂停状态或者只是位于顶部的东西......
    • 在网络上为我工作,我从未尝试过使用 AIR。这发生在设备和模拟器上吗?查看更多代码或您正在做的简单示例可能会有所帮助。请记住,舞台视频位于您的应用下方,因此作为最后的手段,您可以将其隐藏。
    • 您好,是的,它在 AIR 3.3(最新版本)和安卓设备上。我基本上按照教程创建了一个 StageVideoDisplay 类,该类具有一个 play() 方法,该方法执行简单的网络连接和网络流对象。之后,我只需检查可用性并使用视频对象或 stage.stageVideos[0] 对象。当我点击后退按钮时,我尝试将所有内容都归零并删除侦听器,但这似乎并没有做任何事情。在视图初始化时,我调用在 mxml 中实例化的类的 play() 函数
    • 我是否应该监听 netstatus 事件并在离开视图之前处理掉?
    【解决方案2】:

    好的,问题实际上是,尽管由于我在状态中收到“加速”消息,它似乎正在使用舞台视频,但它实际上是视频渲染甚至正在运行,并且实际上正在使用经典视频。我唯一需要做的就是将 stage.removeChild(_video) 添加到类的 close() 事件中!!

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多