Come individuare che uno streaming video FLV è stato completato

Per chi usa il component FLVPlayback è semplice, tra i suoi parametri troviamo l’evento COMPLETE che possiamo gestire facilmente ma per quelli come me, a cui il component Macromedia (ormai Adobe) va molto stretto e che quindi se ne sono creati uno in proprio, potrà tornare utile questa spiegazione su come individuare la fine dello streaming di un FLV video.

Partiamo col semplice codice per instanziare un object Video, la NetConnection e la NetStream:

var duration:Number = 0;
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
videoPlayer.attachVideo(ns);
ns.play(“myVideo.flv”);
*
//funzione che viene richiamata quando NetStream riceve i metadata del video
ns.onMetaData = function(evt:Object):Void {
duration = evt.duration;
};
//viene richiamata ogni volta che NetStream cambia status
ns.onStatus = function(evt:Object):Void {
if (this.time > 0 && this.time >= duration) {
trace(“Video complete”)
delete this.onStatus;
}
}

Il suo funzionamento è molto semplice: quando l’object NetStream, ns in questo caso, riceve i MetaData del file video (ossia le informazioni sul video stesso che solitamente i programmi di encoding collocano nell’header del file) recupera il Number duration che corrisponde alla sua durata.
Al cambio di status di ns, nel caso che ci interessa, allo stop dovuto al termine dello streaming (e non per azione volontaria dell’utente) verifichiamo che il time, il tempo del NetStreaming sia maggiore o uguale a duration, la durata dell’flv che abbiamo ottenuto come metadata, in caso di esito positivo cancelliamo onStatus per evitare che l’evento venga erroneamente richiamato di nuovo e lanciamo un trace per avvertire dell’avvenuto completamento del video.

Questo semplice metodo potebbe non funzionare in 2 casi: il più raro si verifica quando stranamente il time del NetStream non raggiunge duration, questo può dipendere da un errato encoding del file, nel caso questo si verifichi potete cambiare la condizione if con quest’altra:

if (this.time > 0 && this.time >= (duration – 0.5))

dove abbiamo sottratto mezzo secondo a duration, se ancora non funziona fate delle prove cambiando la differenza o inserendo un trace(time) per vedere quando si ferma effettivamente lo streaming.

Il secondo caso riguarda la mancanza di metadata nell’FLV: solitamente i programmi encoder inseriscono i soliti metadata nei file convertiti, assicuratevi che ciò avvenga sostituendo al vecchio evento ns.onMetadata queste righe:

ns.onMetaData = function(evt:Object):Void {
// duration = evt.duration;
for (prop:String in evt) {
trace(prop + “: ” + evt[prop]);
}
};

per ottenere un trace() di tutti i metadata inclusi nel file, così vi renderete anche conto di quanti dati utili potete tirare fuori con questo evento :)

Solitamente queste sono le proprietà del file video che ci ritornano:

canSeekToEnd: true
audiocodecid: 2
audiodelay: 0.038
audiodatarate: 96
videocodecid: 4
framerate: 29.9699859619141
videodatarate: 400
height: 480
width: 720
duration: 71.538

e sono informazioni decisamente utili!

Ritieni questo post utile o interessante?
Condividi e Segnala

, , , , , , , ,

Contenuto simile:

  • Come individuare che uno streaming video FLV è stato completato
    FLV2AVI? Mai così semplice con Flash

    FLV2AVI o anche FLV2MOV..perchè no? Stavo cercando proprio oggi un convertitore di file video FLV 2 AVI per inserire un file scaricato da YouTube in un progetto..in giro ce ne stanno vari shareware e anche freeware ma non soddisfacevano pienamente le mie esigenze, poi mi è venuta quest' idea..importare il video FLV...

  • Come individuare che uno streaming video FLV è stato completato
    Flash a tutto schermo

    Avrete notato dall'uscita della versione 9 del Flash Player che molti siti di streaming video tipo YouTube hanno come funzione un reale fullscreen al posto del vecchio e classico popup con l'object a 100% di dimensioni che, oltre a venire bloccato dai soliti controlli blocca popup di IE (Internet Explorer) e simili,...

  • Magic swf2avi
    Magic SWF2AVI

    E' noto che i filmati .swf si possono esportare in formato AVI direttamente dal programma Flash; come già visto nel post FLV2AVI? Mai così semplice con Flash l'esportazione in questo formato video funziona impeccabilmente, almeno per quel che riguarda le animazioni presenti sulla timeline dello stage. Ma dovendo...

  • Come individuare che uno streaming video FLV è stato completato
    FLV e Actionscript AS 3, la classe VideoEvent

    Nel vecchio post Come individuare che uno streaming video FLV è stato completato avevamo affrontato il problema degli eventi di stop dei filmati Flash 8, legato all'embedding dei metadata necessari da parte dell' FLV Encoder. Data la diffusione del formato FLV e dello streaming video tramite Flash è naturale che...

  • Come individuare che uno streaming video FLV è stato completato
    Enciclopedia di Actionscript 2.0, tutta la sintassi, gli elementi e le classi

    Siamo già arrivati alla versione 3.0 dello script di Flash ma ancora pochi sono passati alla nuova suite di Adobe quindi questa "enciclopedia" con tutti gli elementi della versione 2 del linguaggio (classi, oggetti, funzioni etc.), esempi esaustivi, indicizzata in ordine alfabetico, non può che essere ritenuta...

Feed dei commenti dei commenti - lascia un commento - trackback

5 commenti per “Come individuare che uno streaming video FLV è stato completato”

  1. Video FLV e AS3, la classe VideoEvent per intercettare gli eventi | W3 facile - Risorse, tutorial, notizie sul Web per lo sviluppatore ed il webdesigner

    [...] vecchio post Come individuare che uno streaming video FLV è stato completato avevamo affrontato il problema degli eventi di stop dei filmati Flash 8, legato all’embedding [...]

  2. marco

    Ciao, sito interessante anche questo articolo. Stavo utilizzando questo codice peró c’é un problema. L’intercettazione della fine dell’ FLV avviene correttamente, si puo’ associare anche un evento, il problema è che la volta successiva che termina il video non esegue nuovamente l’evento associato. Per spiegarmi meglio:

    //funzione che viene richiamata quando NetStream riceve i metadata del video
    ns.onMetaData = function(evt:Object):Void {
    duration = evt.duration;
    };
    //viene richiamata ogni volta che NetStream cambia status
    ns.onStatus = function(evt:Object):Void {
    if (this.time > 0 && this.time >= duration) {
    trace(“Video completato”)
    playpausebutton.gotoAndPlay(“playautomatico”);
    ns.seek(0);
    ns.pause();
    delete this.onStatus;
    }
    }

    la prima volta funziona correttaemnte ….la seconda volta no…infatti non mi da neanche il trace. Come puó esser risolto?

  3. R.A.M.Page

    prova a commentare
    delete this.onStatus;

  4. marco

    ciao grazie per la risposta….gia’ fatto pero’ poi non esegue correttamente il codice. Ovvio che e’ il delete this.onStatus una volta disattivato non permette la ripetizione. Se provi a testare il codice vedrai che non funziona correttamente.

  5. Davide

    Purtroppo ho notato che stranamente con explorer non va, ok per gli altri browser.

Rispondi al post