Flex Mobile 4.6 StageVideo无法从舞台上移除

时间:2012-09-02 15:25:46

标签: flex air flex4

当我使用stage.stageVideos [0]实例化一个新的StageVideo instsance时,一切都很好,但是当我离开我的视图时,它会在舞台上显示视频。因此,当我转到另一个视图时,它仍然在后台的舞台上显示。我尝试设置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); 
        } 
    } 

当i navigator.popView(),stageVideo保留在舞台上时,甚至在其他视图中,当视图返回到该视图以播放不同的流时,相同的流有点“烧毁”最佳。我想不出办法摆脱它!提前谢谢!

2 个答案:

答案 0 :(得分:2)

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

这对于在您完成后清除VideoStageVideo对象非常有用。

在运行时调用dispose()方法时,可能会收到异常,指示dispose对象上没有名为NetStream的属性。

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

-swf-version=13

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

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

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

答案 1 :(得分:0)

好的问题实际上是,即使看起来舞台视频正在使用,因为我在状态中获得了“加速”消息,实际上视频渲染甚至正在运行,而经典视频实际上正在使用中。我唯一需要做的就是将stage.removeChild(_video)添加到类!!中的close()事件中。