Frage

Ich muss in ActionScript 2 dynamisch ein Videoobjekt erstellen und es einem Movieclip hinzufügen.In AS3 mache ich einfach Folgendes:

var videoViewComp:UIComponent; // created elsewhere    

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

Leider kann ich nicht herausfinden, wie ich das in AS2 bewerkstelligen kann.Video ist kein untergeordnetes Element von MovieClip, daher scheint mir attachmentMovie() nichts zu bringen.Ich sehe auch kein Äquivalent zur UIComponent.addChild()-Methode von AS3.

Gibt es eine Möglichkeit, in AS2 dynamisch ein Videoobjekt zu erstellen, das tatsächlich auf der Bühne angezeigt wird?


Möglicherweise benötige ich jedoch mehrere Videos gleichzeitig.Ist es möglich, dieses Videoobjekt zu duplizieren?

Ich glaube, ich habe eine andere funktionierende Lösung.Es ist nicht optimal, aber es passt zu einigen Dingen, die ich für andere Komponenten tun muss, sodass es im Projekt nicht zu fehl am Platz ist.Sobald ich es herausgefunden habe, werde ich hier posten, was ich gemacht habe.

War es hilfreich?

Lösung

Ok, ich habe etwas zum Laufen gebracht.

Zuerst habe ich ein neues Bibliothekssymbol erstellt und es „VideoWrapper“ genannt.Anschließend habe ich ein einzelnes Videoobjekt mit der ID „Video“ hinzugefügt.

Jetzt kann ich jedes Mal, wenn ich meinem Status dynamisch ein Video hinzufügen muss, MovieClip.attachMovie() verwenden, um eine neue Kopie des Videoobjekts hinzuzufügen.

Zur Vereinfachung habe ich eine VideoWrapper-Klasse geschrieben, die die grundlegende Handhabung von UI-Elementen (setPosition(), setSize() usw.) offenlegt.Wenn ich also mit dem Video im regulären UI-Layoutcode arbeite, verwende ich einfach diese Methoden, damit es genauso aussieht wie alle meine anderen UI-Elemente.Wenn ich mit dem Video arbeite, greife ich einfach auf das „Video“-Mitglied der Klasse zu.

Meine eigentliche Implementierung ist etwas komplizierter, aber das sind die Grundlagen, wie ich die Dinge zum Laufen gebracht habe.Ich habe eine Test-App, die zwei Videos abspielt, eines von der lokalen Kamera und eines per Streaming von FMS, und es funktioniert großartig.

Andere Tipps

Um Ihnen die Enden einer Zeile zu senden, die ein Tag ist, verwende ich HTML-Symbolentitäten von w3schools

Ein Beispiel aus einem Projekt wäre wie folgt:

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

Die obige Zeile zeigt, dass es ein Verzeichnis namens „library“ gibt, das die Datei enthält video.swf

Außerdem gibt es im Verzeichnis „library“ die Datei „video.xml“.Diese Datei enthält die Zeilen

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

Vor langer Zeit hat mein Sohn Alex den Code der VideoDisplay-Klasse und die Verzeichnisbibliothek aus dem Internet heruntergeladen

Ich habe den Code der Klasse VideoDisplay überprüft.

durch Schreiben von 2 Mitgliedern

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

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

Das von mir erstellte Programm ist mehr als ein Entdecker und Moderator von .flv Dateien

Es ist auch ein Entdecker und Moderator der ausgewählten Fragmente von jedem .flv Datei

Der Code der VideoDisplay-Klasse lautet nun:

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;

    //}
}

Ich empfehle Ihnen, eine einzelne Instanz des Videoobjekts zu erstellen und es unsichtbar zu lassen (d. h. videoview.visible = false) und laden Sie den Clip, wenn Sie ihn benötigen, und zeigen Sie ihn zum richtigen Zeitpunkt an.Sie können auch verwenden swapDepth() wenn es notwendig wird.

Die Videoverarbeitung in AS2 ist nicht die beste überhaupt.Seien Sie versichert, dass Sie auf viele kleine Probleme stoßen werden (Looping ohne Lücken usw.).

Ihr Ansatz ist der, den ich normalerweise mache, weil eine andere Option darin besteht, die UI-Komponente mediaDisplay in die Bibliothek einzubinden und diese Komponente dann mit attachmentMovie anzuhängen, aber ich fand mediaDisplay etwas fehlerhaft, also bevorzuge ich die Verwendung der primitiven Videoinstanz.

Ich hoffe, dass der folgende Code für Sie sehr nützlich sein wird:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top