Flash Player 10.1: NetStream-Klasse kann ByteArrays abspielen

Mit Flash Player 10.1 kommt die langersehnte Möglichkeit, der NetStream-Klasse auch ein ByteArray als Input zu übergeben. Somit ist man nicht mehr darauf beschränkt, eine fertiges Videofile von einem Server abzuspielen, sondern kann direkt einen Datenstrom einlesen und abspielen.

Die neue Methode im Flash Player 10. dazu heißt NetStream.appendBytes().

Passes a ByteArray into a NetStream for playout. Call this method on a NetStream in „Data Generation Mode“. To put a NetStream into Data Generation Mode, call NetStream.play(null) on a NetStream created on a NetConnection connected to null. Calling appendBytes() on a NetStream that isn’t in Data Generation Mode is an error and raises an exception.

NetStream-Beispiel mit ByteArray

Um das folgendes Beispiel ausprobieren, benötigt man den aktuellsten Flash Player 10.1 (RC4) aus den Adobe Labs. Ein Klick auf den Button „Open FLV” öffnet den Datei-Browser, in dem man einfach eine lokale FLV-Datei auswählt. Diese wird als ByteArray geöffnet und abgespielt.

[kml_flashembed publishmethod=“dynamic“ fversion=“10.1.0″ movie=“/wp-content/uploads/2010/05/NetStreamByteArrayDemo.swf“ width=“500″ height=“310″ targetclass=“flashmovie“]

Get Adobe Flash player

[/kml_flashembed]

Quellcode

Zu beachten ist, dass man NetStream.play(null) ausführen muss, bevor man das ByteArray zuweist.

Um das Projekt zu kompilieren, habe ich den Flash Builder 4 benutzt. Das Projekt muss man auf Flash Player 10.1 als Mindestvoraussetzung umstellen. Die fehlende playerglobal.swc für Flash Player 10.1 findet man in den Adobe Labs und kopiert sie an den Pfad aus der Fehlermeldung.

[xml]




[/xml]

Link: ByteArray Access to NetStream in Flash Player 10.1
Link: NetStream.appendBytes

[ad]

11 Gedanken zu „Flash Player 10.1: NetStream-Klasse kann ByteArrays abspielen“

  1. Endlich… Somit ist eine Lösung mit Progressiven Download über Lighttpd (Pseudo Streaming) obsolet.

    Danke für den Beitrag.

    lG cHrIsZ

  2. Hat sich schon jemand näher mit dem Thema befasst bzw. etwas ausprobiert?

    Ich komm irgendwie nicht dahinter, wie ich auf dem "Stream" dann springen kann, also seek() ausführe.

    Laut docs soll man den Seek.Notify Event abfangen und dann
    appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);
    durchführen

    Nur bringt das nicht wirklich etwas und ehrlich gesagt steige ich auch durch die weitere Hilfe nicht so ganz durch.

    Ich wäre unendlich dankbar, wenn mir überhaupt jemand bestätigen könnte, dass seek() im Data-Generation-Mode überhaupt noch funktioniert??

    Viele Grüße,
    Bastian

  3. hallo,

    so einfach geht das nicht…flash player erwartet entsprechend neue h.264 header im datenstrom.

    das heißt ihr mußte die frames entsprechend encodieren zu einem neuen keyframe in as3.

    das bietet adobe selber nicht an.

    machbar ist das aber..die details sprengen aber diesen eintrag. in as3 sind das einige hundert zeilen code. schaut euch einfach die specs von h.264 und einen h.264 decoder / encoder mal an. da gibst genug resourcen.

    bei diesem beispiel haben wir sogar die segmentieren aus mehreren quellen zu einem bytearray-bitstream in realtime gemuxt.

    http://onlinelib.de/demos/fhttp3

    feedback wäre nett..

    gary
    http://onlinelib.de

  4. also ich hab nur mal versucht mich in die flv-specification einzulesen und möglicherweise mehr infos zu meinem seek()-problem zu finden – nur leider fehlanzeige ;(

    mich in den h.264 codec selbst einzuarbeiten ist mir dann fast zu viel für ein uni-seminar ;)

    soweit ich das aber jetzt verstanden habe, müsste es doch möglich sein, eine art flv-parser zu schreiben, der mir entsprechend die gewünschten timecodes in der flv ausliest und bei einem seek schiebt man die benötigten bytes (also die flv-tags) manuell nach?

    einziger unterschied zu dem RESET_BEGIN ist ja anscheinend, dass der header nicht geflushed wird

    aber da ich mich jetzt erst seit gestern überhaupt mit der thematik auseinandersetze, wage ich zu bezweifeln, dass meine theorie korrekt ist :D

    trotzdem vielen dank! aber ich werde dann wohl darauf verzichten, ohne einen kompletten preload seeken zu können…

    hätte die option nur gerne gehabt, weil ich so auch direkt z.b. aus einer zip heraus meine videos abspielen könnte, ohne sie vorher temporär auslagern zu müssen

    viele grüße,
    bastian

  5. Als Hinweis vielleicht noch den Tipp, mal im OSMF nachzuschauen, wie es dort implementiert ist.

    @gary: Danke für die sachdienlichen Hinweise.

  6. der Aufruf _netStream.pause() funktioniert problemlos um mein Video anzuhalten, doch wie kann ich das Video wieder starten (_netStream.play() funktioniert nicht???) bzw. eine seek(sek:Number) Methode implementieren?…

  7. Hallo !

    Ich verfolge deine Tipps schon seit mehreren Tagen und bin echt erstaunt was man mit Flash alles so machen kann. Ich komme ursprünglich aus der serverseitigen Programmierung (PHP, mySQL, "JS") und arbeite mich momentan etwas in Flash ein.

    Warum ich hier schreibe:
    Ich versuche seit mehreren Tagen einen Flash-Player zu bauen, welcher mittels eines PHP-Scripts einen abzuspielenden Film (FLV-Dateiname) laden soll, diesen Film vorladen, abspielen und während des abspielens (z.B. nach 3 Sekunden wenn der aktuelle Film läuft) einen weiteren Film vom PHP-Script vorlädt. Wenn/bevor der 1. Film endet, soll der nachgeladene 2. Film reibungslos und ohne ruckeln abgespielt werden. Das ganze wiederholt sich unendlich lange und das PHP-Script liefert dazu immer wieder neue FLV-Dateien.

    Meine bisherigen Vorgehensweisen:
    Angefangen dies zu realisieren habe ich mit der FlvPlayback-Komponente. Dort verwendete ich 2 Player. Dazu habe ich mehrere Varianten ausprobiert um einen reibungslosen Übergang zwischen den Filmen zu bekommen. (Cue-Points, Status-Handler, setTimeout-Schleifen welche die Länge eines Films ermitteln u.s.w.) – Zwar funktionierten diese Dinge, jedoch war es mir absolut nicht möglich einen reibungslosen Übergang hinzubekommen. (Ebenfalls habe ich mit den FrameRaten rumgespielt, Berechnungen der FrameRate mit Berechnungen des Intervals von setInterval u.s.w.) nichts funktionierte reibungslos. Irgendwie war immer ein ruckeln zu früh oder zu spät, da die Zeit-Intervals wahrscheinlich immer auf die aktuelle FrameRate bezogen sind und dadurch sehr ungenau.

    Auf bytearray.org habe ich dann einige Infos gelesen, wobei es wohl möglich sein soll eine FLV-Datei als ByteArray einzulesen um dieses ByteArray dann abspielen zu können. Ebenfalls soll es möglich sein mit AppendBytes zu arbeiten um das ByteArray zu erweitern !? (Falls ich falsch liege, lass es mich wissen ;))

    Was ich mir nun vorstelle:
    Ist es irgendwie möglich eine Reihe von FLVs mittels meiner oben beschriebenen Methode (PHP-Script lädt die FLVs immer nach) mit dieser Art von ByteArrays REIBUNGSLOS und OHNE RUCKELN hintereinander abzuspielen ?

    Über Infos dazu würde ich mich riesig freuen !

    Danke !
    Stefan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert