Come posso creare dinamicamente un oggetto Video in AS2 e aggiungerlo a un MovieClip?
-
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.
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