Úgy érzem ezt meg kell, hogy osszam, mert szükség lehet rá a jövőben. Túrkáltam a netet érte fél napon keresztül, innen-onnan összejött egy jó kis alap, ha az ember video bannert akar készíteni.
A kódokat úgy próbáltam leírni, hogy magában a flash fejlesztőkörnyzetben használhatóak legyenek, tehát egyenesen másolható a timeline-ra. Sietek leszögezni, nem szeretem a timeline-os kódolást, de egy egyszerű banner esetén nincs szükség külső osztályok létrehozására.
lássuk:
Itt a cégben Tweenert használunk a szabványos flash elemek mozgatásához, erre nem fecsérelnék sok időt, akit érdekel, az itt megnézheti. Esetleg a greensock cuccait, melyek itt találhatóak. A videó újraindítása ezeknek a segítségével történik majd, a végén visszatérek rá.
Definiáljuk a videó lejátszásához sükséges változókat:
var video:Video;
var nc:NetConnection;
var ns:NetStream;
var URLVideo:String = "http://www.ateszervered.hu/atevideod.flv"
Az URLVideo sztring mutat a lejátszandó videóra.
Nézzük a videó betöltését, hozzunk létre egy Video osztályt a megfelelő paraméterekkel:
initVideo()
function initVideo(){
// létrehozzuk a Video osztály egy példányát
// amely megkapja a stage szélességét és magasságát
video = new Video(stage.stageWidth, stage.stageHeight);
// a video példányt hozzáadjuk ahhoz az osztályhoz
// ahol éppen vagyunk. ez lehet egy bármilyen MovieClip
// is ami a stage-en található
addChild(video);
// rápakolunk egy élsímítást a video példányunkra
// hogy szebb legyen a videó lejátszáskor
video.smoothing = true;
}
Ebbe fogjuk beletölteni a külső urlről betöltött flv fájlt. Ezt a metódust többet nem kell meghívnunk, fölösleges terhelni a gép memóriáját újabb és újabb példányok létrehozásával.
A következő lépésben hozzunk létre egy NetConnection és egy NetStream példányt.
initVideoStream();
function initVideoStream(){
// A NetConnection kétirányú kapcsolatot hoz létre a
// kliens és a szerver között.
nc = new NetConnection();
// A connect-el hozzuk létre a kapcsolatot, általános
// esetben webszerverről kapjuk a videót ehhez egy
// null-t kell átadnunk.
nc.connect(null);
// A NetStream megnyit egy egyirányú streaming
// csatornát a NetConnection-on keresztül
ns = new NetStream(nc);
// Az AsyncErrorEvent listenert azért adjuk hozzá,
// mert ha tartalmaz metadatát a video, akkor az
// megpróbálja lekezeltetni azt a cliens oldalon,
// de ha ehhez nincs definiálva kód, akkor errort
// fogunk kapni.
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,
asyncErrorHandler);
// A NetStatusEvent minden olyan eseményről
// értesít minket ami a NetStream objektumunkal
// történik, ezzel tudjuk majd a későbbiekben
// elindítani a bannerünket
ns.addEventListener(NetStatusEvent.NET_STATUS,
videoStatusEvent);
// Adunk neki egy buffert, lassú netkapcsolat
// esetén ez hasznos lehet
ns.bufferTime = 5;
// hozzácsapjuk a videó objektumunkhoz
// a NetStream-et
video.attachNetStream(ns);
// A play-el értelemszerűen indítjuk a lejátszást
ns.play(URLVideo);
}
Ezt metódust sem kell többé meghívni, a létrehozott objektumok bőven elegendőek ahhoz, hogy megfelelően működjön a bannerünk.
A fenti kódrészletben a NetStream objektumunkhoz hozzáadtunk két listenert, kezeljük le azokat:
function videoStatusEvent(statusObject:Object):void{
// trace-szel láthatjuk, hogy milyen események
// történnek a video lejátszásakor, ezekhez
// tudjuk igazítani a banner lefutását.
// Ilyenek pl a NetStream.Buffer.Flush ez jelzi,
// hogy a buffer tele van, indulhat a lejátszás.
// Érdekes lehet még a NetStream.Play.Stop
// (ezzel elindíthatjuk a banner többi részének
// lejátszását) vagy a NetStream.Play.Start,
// használja mindenki azt ami neki megfelel.
trace (statusObject.info.code);
if(statusObject.info.code=="NetStream.Buffer.Flush"){
// innen elindíthatunk egy tweenert ami
// mozgatja a banner animált részét
}
}
function asyncErrorHandler(event:AsyncErrorEvent):void
{
// ide nem kell semmi, ezzel kiküszöböljük a
// lehetséges metadata által okozott problémákat
}
Ha már nincs szükségünk a banner végéig a videó utolsó képkockájának látványára, nem kell, hogy fusson a videó, akkor állítsuk le, tekerjük az elejére, adjunk még egy cleart a videónak, hogy törölje a képet.
function pauseVideo():void{
// NetStream-et leállítjuk
ns.pause();
// visszacsévéljük az elejére (videót csévélni
// szokták? :))
ns.seek(0);
// adunk egy clear-t a videó objektumnak, hogy
// eltüntessük a képet, ha még lenne rajta valami.
video.clear();
}
Ezt a metódust egyik tweener használata után, a movieclipek mozgatása közben hívhatjuk meg. A pause és a seek fontos része a folytonos lejátszásnak, ezeknek köszönhető, hogy nem kell a NetStream play funkcióját újra hívni, amely újra kapcsolódna a szerverhez és így terhelné is azt rendesen.
Ha vége a tweener animációnak, újra kell indítanunk a videót. Ez hallgatólagosan a doLoop metódussal történik:
function doLoop():void{
// A resume újra indítja a pause-zal leállított
// NetStream-et
ns.resume();
}
FONTOS!: A NetStatusEvent-et használjuk arra, hogy elindítsuk a tweener animációinkat, abból történhet a legjobb időzítés.
Boldog kódolást! :)