flash és más

Elkezdtem az Androidot tanulgatni, ide jegyzetelek magam és mások okulására. Flash programozás is lesz, ha úgy érzem, hogy van olyan amit szívesen megosztanék másokkal.

Friss topikok

Video banner flash-ben

2012.03.02. 11:17 hopetheorc

Ú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! :)

Szólj hozzá!

A bejegyzés trackback címe:

https://hopetheorc.blog.hu/api/trackback/id/tr624284171

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása