Videolänge bei NetStream ermitteln

Tobias Menzel

Erfahrenes Mitglied
Hallo,

ich arbeite im Moment an einem kleinen Tutorial/Beispiel für einen Videoplayer mit FLV-Streaming. Ich nehme an, dass die Videotutorials hier im Forum ähnlich aufgebaut sind. Dort wird die Länge des Videos in Sekunden angezeigt und spiegelt sich auch in der Position des Indikators für die Position wieder.

Die NetStream-Klasse bietet zwar Methoden zum Abfragen der geladenen/maximalen Bytes sowie der Bufferlänge, aber ich sehe keine Möglichkeit, die Länge des Videos in Sekunden zu ermitteln. Mein bisheriger Ansatz war, mit seek(x) von einer angenommenen maximalen Länge rückwärts Positionen anzusteuern, bis NetStream.time einen positiven Wert zurückgibt. Das funktioniert zwar offline mit einer kleinen Verzögerung, macht im Netz aber aufgrund der Ladezeit für den Buffer wenig Sinn (und ist auch nicht besonders elegant).

Gibt es eine Möglichkeit, die Videolänge aus dem Video direkt zu ermitteln (Kompressionsrate und Byte/Sekunde sind generell unbekannt), oder muss ich einen Index auf dem Server anlegen, in dem ich die Längen manuell eintrage? In der Flashhilfe wird angedeutet, ich könne weitere Informationen über ein FLV auslesen:
Flashhilfe hat gesagt.:
Mit externen FLV-Dateien ist es leichter, Video-Inhalte zu erfassen, da Sie mit Ereignisprozeduren auf die Metadaten des Videos zugreifen können.

Gruß
.
 
Es gibt eine von Macromedia nachträglich und recht schlampig implementierte Eigenschaft namens onMetaData.
Einige neuere Tools schreiben die automatisch in flvs, ansonsten gibt es auch etliche die das nachträglich reinschreiben, z.B. http://www.buraks.com/flvmdi/
Man kann das auch nachträglich von Hand mitm Notepad eintragen, bzw wenn onMetaData gesetzt wurde und man die flv mit einem Texteditor öffnet, sieht man das es als normaler Text ganz vorne drinsteht.

Sofern onMetaData in der flv gesetzt ist kommt man so an einige Werte ran:
PHP:
// meta daten empfangen
netStream.onMetaData = function(obj) {
        duration = Math.round(obj.duration);
        videolaenge = duration;
        trace("stream_ns ::: onMetaData");
        trace("duration: "+obj.duration);
        trace("videodatarate: "+obj.videodatarate);
        trace("audiodatarate: "+obj.audiodatarate);
        trace("----------------------------------------------");
};
Ich hab meinen funkionierenden flv-Player gerade in der Agentur,
aber ansonsten einfach mal googeln.
Das Zauberwort heißt auf jeden Fall onMetaData. :)
 
Hi,

danke Dir. Das wird eigentlich schon das gewesen sein, was ich suchte. :)

Einige Dinge sind in der Hilfe (die sich bei mir noch nie updaten ließ) doch recht schlecht dokumentiert und ich und die Macromedia-Seite sind nicht grade gute Freunde (das Ding ist saulangsam und die Suche findet meist nicht das was ich will ;) ).

Gruß
.
 
Hmm... ich fand nun jenes:
to make onMetaData work you need to add the line-
function onMetaData(info:Object):Void;

into
Flash MX 2004\en\First Run\Classes\NetStream.as intrinsic class NetStream

Scheint auch soweit zu klappen (jedenfalls bekomme ich keine Fehlermeldung mehr).

Nun habe ich meiner FLV-Datei mit FLVMDI Metadaten hinzugefügt (sind im Editor auch sichtbar). Allerdings wird onMetaData mit dieser Datei nie aufgerufen.

@Chris: Wenn Du noch irgendwo Deinen Player findest, wäre ich dankbar, wenn Du die entsprechenden Zeilen bzw. die Konfiguration posten könntest, mit denen Du die Daten erhältst.

Gruß
.
 
Zuletzt bearbeitet:
Der Player liegt hier:
http://kuart.de/flv/

Der ist für FlashComServer ausgelegt und lief auch auf einem solchen,
allerdings funktioniert die NetStream-Klasse da ja genau gleich - theoretisch,
wobei ich mir da gerade auch garnicht mehr so sicher bin, war onMetaData vielleicht nur für FlashComs?

Ach nee:
to make onMetaData work you need to add the line-
function onMetaData(info:Object):Void;

into
Flash MX 2004\en\First Run\Classes\NetStream.as intrinsic class NetStream
Vor allem die letzten Kommentare hier sind recht aufschlussreich: http://livedocs.macromedia.com/flas....htm?context=Flash_MX_2004&file=00001589.html
hier steht´s sonst auch nochmal:
http://devmx.mm-en.com/2005/04/netstreamonmetadata-undocumented-flash.html
Hab ich anscheind alles schon wieder vergessen... :rolleyes:
 
Danke, hat nun auch funktioniert. Der Grund, warum ich keine Metadaten bekam, lag darin, dass ich noch meine alte Funktion zur manuellen Suche der Dauer implementiert hatte (jene, welche per seek() rückwärts sucht). Damit habe ich das Auslesen der Daten irgendwie angewürgt. ;)

Gruß
.
 
Zurück