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:
dei commenti -
lascia un commento - trackback







[...] 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 [...]
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?
prova a commentare
delete this.onStatus;
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.
Purtroppo ho notato che stranamente con explorer non va, ok per gli altri browser.