Pregunta

Necesito crear dinámicamente un objeto de vídeo en ActionScript 2 y agregarlo a un clip de película.En AS3 solo hago esto:

var videoViewComp:UIComponent; // created elsewhere    

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

Desafortunadamente, no puedo entender cómo lograr esto en AS2.El video no es hijo de MovieClip, por lo que adjuntoMovie() no parece darme nada.Tampoco veo ningún equivalente al método UIComponent.addChild() de AS3.

¿Hay alguna forma de crear dinámicamente un objeto de vídeo en AS2 que realmente aparezca en el escenario?


Sin embargo, potencialmente necesito varios videos a la vez.¿Es posible duplicar ese objeto de video?

Creo que tengo otra solución funcionando.No es óptimo, pero encaja con algunas de las cosas que tengo que hacer para otros componentes, por lo que no está demasiado fuera de lugar en el proyecto.Una vez que lo tenga resuelto, publicaré lo que hice aquí.

¿Fue útil?

Solución

Ok, tengo algo funcionando.

Primero, creé un nuevo símbolo de Biblioteca y lo llamé "VideoWrapper".Luego agregué un único objeto Video con una identificación de "video".

Ahora, cada vez que necesito agregar dinámicamente un video a mi estado, puedo usar MovieClip.attachMovie() para agregar una nueva copia del objeto Video.

Para facilitar las cosas, escribí una clase VideoWrapper que expone el manejo básico de elementos de la interfaz de usuario (setPosition(), setSize(), etc.).Entonces, cuando trato con el video en el código de diseño de la interfaz de usuario normal, solo uso esos métodos para que se vea igual que todos los demás elementos de la interfaz de usuario.Cuando trato con el video, simplemente accedo al miembro "video" de la clase.

Mi implementación real es un poco más complicada, pero esos son los conceptos básicos de cómo hice que todo funcionara.Tengo una aplicación de prueba que reproduce 2 videos, uno de la cámara local y otro que se transmite desde FMS, y funciona muy bien.

Otros consejos

Para enviarle los extremos de una línea que es una etiqueta, utilizo entidades de símbolo HTML de w3escuelas

Un ejemplo, tomado de un proyecto sería el siguiente:

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

La línea de arriba muestra que hay un directorio llamado biblioteca que contiene el archivo video.swf

Además, existe el archivo video.xml en el directorio biblioteca.Ese archivo contiene las líneas.

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

Hace mucho tiempo mi hijo Alex descargó el código de la clase VideoDisplay y la biblioteca del directorio de Internet.

He probado el código de la clase VideoDisplay.

escribiendo 2 miembros

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

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

El programa que he creado es más que un explorador y presentador de .flv archivos

También es un explorador y presentador de los fragmentos elegidos de cada uno .flv archivo

Ahora el código de la clase VideoDisplay es:

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;

    //}
}

Le recomiendo que cree una única instancia del objeto Video y la deje invisible (es decir, videoview.visible = false), y cargue el clip cuando lo necesite, mostrándolo en el momento adecuado.También puedes usar swapDepth() si se hace necesario.

El manejo de video en AS2 no es lo mejor que existe.Tenga la seguridad de que se encontrará con muchos pequeños problemas (bucles sin espacios, etc.).

su enfoque es lo que suelo hacer porque otra opción es incluir el componente UI mediaDisplay en la biblioteca y luego adjuntar ese componente usando adjuntarMovie, pero encontré que mediaDisplay tiene algunos errores, así que prefiero usar la instancia de video primitiva.

Espero que el siguiente código te sea de gran utilidad:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top