AS2 で Video オブジェクトを動的に作成し、それを MovieClip に追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/52732

  •  09-06-2019
  •  | 
  •  

質問

ActionScript 2 で Video オブジェクトを動的に作成し、それをムービークリップに追加する必要があります。AS3 ではこれを行うだけです。

var videoViewComp:UIComponent; // created elsewhere    

videoView = new Video();
videoView.width = 400;
videoView.height = 400;
this.videoViewComp.addChild(videoView);

残念ながら、AS2 でこれを実現する方法がわかりません。Video は MovieClip の子ではないため、attachMovie() は何も取得していないようです。AS3 の UIComponent.addChild() メソッドに相当するものも見当たりません。

実際にステージ上に表示される Video オブジェクトを AS2 で動的に作成する方法はありますか?


ただし、一度に複数のビデオが必要になる可能性があります。そのビデオオブジェクトを複製することは可能ですか?

別の解決策が機能すると思います。これは最適ではありませんが、他のコンポーネントに対して実行しなければならないことの一部と一致しているため、プロジェクト内でそれほど場違いではありません。理解できたら、私がやったことをここに投稿します。

役に立ちましたか?

解決

よし、何かうまくいったよ。

まず、新しいライブラリ シンボルを作成し、「VideoWrapper」という名前を付けました。次に、「video」という ID を持つ 1 つの Video オブジェクトをそれに追加しました。

これで、ビデオをステートに動的に追加する必要があるときはいつでも、MovieClip.attachMovie() を使用して Video オブジェクトの新しいコピーを追加できます。

作業を簡単にするために、基本的な UI 要素の処理 (setPosition()、setSize() など) を公開する VideoWrapper クラスを作成しました。したがって、通常の UI レイアウト コードでビデオを扱うときは、他のすべての UI 要素と同じように見えるように、これらのメソッドを使用するだけです。ビデオを扱うときは、クラスの「video」メンバーにアクセスするだけです。

実際の実装はもう少し複雑ですが、これが私が物事を機能させる方法の基本です。ローカル カメラから 1 つと FMS からストリーミングする 2 つのビデオを再生するテスト アプリがありますが、問題なく動作しています。

他のヒント

タグである行の終わりを送信するには、次の HTML シンボル エンティティを使用します。 w3スクール

プロジェクトから抜粋した例は次のようになります。

< asset path="library\video.swf" />

上の行は、ファイルを含む library というディレクトリがあることを示しています。 video.swf

さらに、ディレクトリ ライブラリには video.xml ファイルがあります。そのファイルには次の行が含まれています

<xml version="1.0" encoding="utf-8" >
<movie version="7">    
    <frame>
        <library>
            <clip id="VideoDisplay">
                <frame>
                    <video id="VideoSurface" width="160" height="120" />
                    <place id="VideoSurface" name="video" />
                </frame>
            </clip>
        </library>
    </frame>
</movie>

昔、息子の Alex が VideoDisplay クラスのコードとディレクトリ ライブラリをインターネットからダウンロードしました。

VideoDisplay クラスのコードを改良しました。

メンバー 2 名を書いて

 public function pos():Number
{
    return ns.time;
}

     public function close():Void
{
    return ns.close();
}

私が作成したプログラムは、エクスプローラーとプレゼンター以上のものです .flv ファイル

それはまた、それぞれの選ばれた断片の探検家でありプレゼンターです .flv ファイル

VideoDisplay クラスのコードは次のようになります。

class util.VideoDisplay
{
    //{ PUBLIC MEMBERS


    /**
    * Create a new video display surface
    */

    function VideoDisplay(targetURI:String, parent:MovieClip, name:String, depth:Number, initObj)

    {
        display = parent.attachMovie("VideoDisplay", name, depth, initObj);

        // create video stream
        nc = new NetConnection();
        nc.connect(targetURI);
        ns = new NetStream(nc);

        // attach the video stream to the video object
        display.video.attachVideo(ns);
    }

    /**
    * Video surface dimensions
    */
    function setSize(width:Number, heigth:Number):Void
    {
        display.video._width = width;
        display.video._height = heigth;
    }
    /**
    * Video clip position
    */
    function setLocation(x:Number, y:Number):Void
    {
        display._x = x;
        display._y = y;
    }

    /**
    * Start streaming
    * @param    url FLV file
    * @param    bufferTime  Buffer size (optional) 
    */
    public function play(url:String, bufferTime:Number):Void
    {
        if (bufferTime != undefined) ns.setBufferTime(bufferTime);
        ns.play(url);
    }
    /**
    * Pause streaming
    */
    public function pause():Void
    {
        ns.pause();
    }
    /**
    * Seek position in video
    */
    public function seek(offset:Number):Void
    {
        ns.seek(offset);
    }   

    /**
    * Get position in video
    */

     public function pos():Number
    {
        return ns.time;
    }

         public function close():Void
    {
        return ns.close();
    }

    //}

    //{ PRIVATE MEMBERS 

    private var display:MovieClip;
    private var nc:NetConnection;
    private var ns:NetStream;

    //}
}

Video オブジェクトのインスタンスを 1 つ作成し、非表示のままにすることをお勧めします (つまり、 videoview.visible = false)、必要なときにクリップをロードし、適切なタイミングで表示します。も使用できます swapDepth() 必要になった場合。

AS2 でのビデオ処理は、これまでで最高のものではありません。多くの小さな問題 (ギャップなしでループするなど) に遭遇することはありませんので、ご安心ください。

他のオプションは、UIcomponent mediaDisplay をライブラリに含めてから、attachMovie を使用してそのコンポーネントをアタッチすることなので、あなたのアプローチは私が通常行うことですが、mediaDisplay には少しバグがあることがわかったので、プリミティブビデオインスタンスを使用することを好みます。

以下のコードがあなたのお役に立てば幸いです。

import UTIL.MEDIA.MEDIAInstances

class Main

{
    static function main() {

        var MEDIAInstancesInstance :MEDIAInstances  = new MEDIAInstances (); 

        _root.Video_Display.play ("IsothermalCompression.flv", 0);

        _root.VideoDisplayMC.onPress = function() { 

        _root.Video_Display.seek (0);        

        } // _root.displayMC.onPress = function() {

    } // static function main() 

} // class Main 

// 

import UTIL.MEDIA.VideoDisplay  

class UTIL.MEDIA.MEDIAInstances             

    {  

    function MEDIAInstances() 

    {

    //                                            depth  
    _root.createEmptyMovieClip ("VideoDisplayMC", 500);   
    //
    var Video_Display:VideoDisplay 
    = 
    new VideoDisplay(_root.VideoDisplayMC, "Video_Display", 1); 

    Video_Display.setLocation(400, 0); Video_Display.setSize (320, 240);      
    //    
    _root.Video_Display = Video_Display;  _root.VideoDisplayMC._alpha = 75;      

    } // MEDIAInstances()

} // class UTIL.MEDIA.MEDIAInstances

//

class UTIL.MEDIA.VideoDisplay

{
    private var display:MovieClip, nc:NetConnection, ns:NetStream;

    function VideoDisplay(parent:MovieClip, name:String, depth:Number)

    {
        display = parent.attachMovie("VideoDisplay", name, depth);

        nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc);

        display.video.attachVideo(ns);
    }
    function setSize(width:Number, heigth:Number):Void

    { display.video._width = width; display.video._height = heigth;}

    function setLocation(x:Number, y:Number):Void { display._x = x; display._y = y;}

    public function play(url:String, bufferTime:Number):Void
    {
        if (bufferTime != undefined) ns.setBufferTime(bufferTime); ns.play(url);
    }
    //
    public function pause():Void { ns.pause();}
    //
    public function seek(offset:Number):Void { ns.seek(offset); }

} // UTIL.MEDIA.VideoDisplay
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top