Come posso creare dinamicamente un oggetto Video in AS2 e aggiungerlo a un MovieClip?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Devo creare dinamicamente un oggetto Video in ActionScript 2 e aggiungerlo a un clip filmato.In AS3 faccio solo questo:

var videoViewComp:UIComponent; // created elsewhere    

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

Sfortunatamente, non riesco a capire come eseguire questa operazione in AS2.Il video non è figlio di MovieClip, quindi attachMovie() non sembra procurarmi nulla.Non vedo nemmeno alcun equivalente al metodo UIComponent.addChild() di AS3.

Esiste un modo per creare dinamicamente un oggetto Video in AS2 che venga effettivamente visualizzato sullo stage?


Tuttavia, potenzialmente ho bisogno di più video alla volta.È possibile duplicare quell'oggetto video?

Penso di avere un'altra soluzione funzionante.Non è ottimale, ma si adatta ad alcune delle cose che devo fare per altri componenti, quindi non è troppo fuori posto nel progetto.Appena avrò capito, posterò qui quello che ho fatto.

È stato utile?

Soluzione

Ok, ho qualcosa che funziona.

Per prima cosa ho creato un nuovo simbolo della Libreria e l'ho chiamato "VideoWrapper".Ho quindi aggiunto un singolo oggetto Video con l'ID "video".

Ora, ogni volta che devo aggiungere dinamicamente un video al mio stato, posso utilizzare MovieClip.attachMovie() per aggiungere una nuova copia dell'oggetto Video.

Per semplificare le cose ho scritto una classe VideoWrapper che espone la gestione di base degli elementi dell'interfaccia utente (setPosition(), setSize(), ecc.).Pertanto, quando ho a che fare con il video nel normale codice di layout dell'interfaccia utente, utilizzo semplicemente questi metodi in modo che assomigli a tutti gli altri elementi dell'interfaccia utente.Quando ho a che fare con il video accedo semplicemente al membro "video" della classe.

La mia effettiva implementazione è un po' più complicata, ma questa è la base su cui ho fatto funzionare le cose.Ho un'app di prova che riproduce 2 video, uno dalla telecamera locale e uno in streaming da FMS, e funziona benissimo.

Altri suggerimenti

Per inviarti la fine di una riga che è un tag, utilizzo HTML Symbol Entities from w3schools

Un esempio, tratto da un progetto, sarebbe il seguente:

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

La riga sopra mostra che esiste una directory chiamata libreria che contiene il file video.swf

Inoltre, c'è il file video.xml nella libreria di directory.Quel file contiene le righe

<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>

Molto tempo fa mio figlio Alex scaricò il codice della classe VideoDisplay e la libreria delle directory da Internet

Ho migliorato il codice della classe VideoDisplay.

scrivendo 2 membri

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

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

Il programma che ho creato è più che un esploratore e presentatore di .flv File

È anche un esploratore e presentatore dei frammenti scelti di ciascuno .flv file

Ora il codice della classe 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;

    //}
}

Ti consiglio di creare una singola istanza dell'oggetto Video, di lasciarla invisibile (ad esempio, videoview.visible = false) e carica la clip quando ne hai bisogno, visualizzandola al momento opportuno.Puoi anche usare swapDepth() se diventa necessario.

La gestione dei video in AS2 non è la cosa migliore in assoluto.Stai certo che incontrerai molti piccoli problemi (loop senza interruzioni, ecc.).

il tuo approccio è quello che faccio di solito perché un'altra opzione è includere il componente UImediaDisplay nella libreria e quindi allegare quel componente utilizzando attachMovie ma ho trovato mediaDisplay un piccolo bug, quindi preferisco utilizzare l'istanza video primitiva.

Spero che il codice seguente ti sia molto utile:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top