Come individuare che uno streaming video FLV è stato completato


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!

Cerca: , , , , , , , ,

Ritieni questo post utile o interessante?
Condividi e Segnala

Leggi anche:

Un commento 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 ha detto:

    […] 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 […]

Rispondi al post