1

stage.stageVideos [0]を使用して新しいStageVideoインスタンスをインスタンス化すると、すべてがうまく機能しますが、ビデオを表示しているビューを離れると、ステージに固定されます。したがって、別のビューに移動すると、それはまだバックグラウンドでステージに表示されています。sv = nullを設定し、イベントリスナーを削除してみました...など。次のようにmxmlでインスタンス化されるStageVideoDisplayクラスを作成しました。ビューの初期化時に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がステージに残り、別のストリームを再生するためにそのビューに戻ると、同じストリームが上に「焼き付け」られます。私はそれを取り除く方法を見つけることができません!前もって感謝します!

4

2 に答える 2

2

Flash Player 11 では、アドビはこのdispose()メソッドをNetStreamクラスに追加しました。

Videoこれは、またはオブジェクトを使い終わったときにクリアするのに役立ちStageVideoます。

実行時にメソッドを呼び出すと、オブジェクトにdispose()名前が付けられたプロパティがないことを示す例外が発生する場合があります。disposeNetStream

これは、Flash Builder が適切な SWF バージョンでアプリケーションをコンパイルしていないために発生します。これを修正するには、これをコンパイラ ディレクティブに追加します。

-swf-version=13

新しい Flash Builder 4.7 では、新しい Flash Player 機能を使用するために SWF のバージョンを指定する必要がなくなることを願っています。

これが最善の解決策のようですが、Flash 11 (または最新の Adob​​e AIR) を使用できない場合は、次のような回避策があります。

  • viewPortステージ ビデオ オブジェクトを、幅 = 0、高さ = 0 の長方形に設定します。
  • ステージ ビデオはアプリの下に表示されるため、いつでもビューポートを覆うことができます (背景色などでDisplayObject) 。
于 2012-09-02T16:50:46.143 に答える
0

問題は、ステータスに「Accelerated」メッセージが表示されてからステージ ビデオが使用されているように見えたにもかかわらず、実際には実行中のビデオ レンダーであり、クラシック ビデオが実際に使用されていたことです。私がする必要があったのは、クラスの close() イベントに stage.removeChild( _video ) を追加することだけでした!!

于 2012-09-02T18:06:05.830 に答える