Imagedata erstellen zu langsam

Zerwas

Mitglied
Hallo,
ich habe ein videoserver geschrieben, der videos aufzeichnet. Dazu gibs einen Eclipse-client, der die aufgezeichneten videos abspielt.

Der Client bekommt vom Server einen Videostream, wo ich dann die einzelnen bilder rausfilter um damit ein Image zu erstellen was ich dann anzeige.

An sich funktioniert alles, aber da ich für die erstellen eines ImageData-Objectes zwischen 50ms bis 200 ms brauche (je nach größe und komprimierung der bilder) bekomme ich eine Maximale framerate von 5 fps.
Die Videos wurden aber mit 12 fps aufgezeichnet.

Meine frage gibt es eine möglichkeit aus einem ByteArray oder ByteArrayInputstream schneller ein Image herzustellen als über das ImageData.

Gruß
Mathias Buchallik
 
Hallo!

Lass die einzelnen Frames einfach von mehreren Threads parallel rendern...
diese fertig gerenderten Bilder fließen (in der richtigen Reihenfolge) in eine Art Buffer.
Den Videostream spielst du nun einfach aus diesem Buffer ab... (eben 10-15 Sekunden verzögert...)

Gruß Tom
 
Mit mehreren Threads hab ich es auch schon ausprobiert leider is das einzige ergebniss, dass der ImageData noch länger braucht um ein Image zu erstellen.
Schon ein stück vorladen will ich nicht machen, da die unterschiedlich groß sein können und bei videos ab einer halben Stunde (Wahrscheinlich schon früher) müsste ich den User ein paar min warten lassen bevor ich es abspiele oder das video verfällt mitten drin plötzlich in "Zeitlupe".

trotzdem Danke für die schnelle antwort
 
ok ich probiers mal (kann leider nich den Code posten):
Erstmal der Stream:
Der Stream ist nach folgendem Muster aufgebaut:
1.Zeile: Zeitstempel
2.Zeile: Content-Type:
3.Zeile: Conten-Length:
4.Zeile: Leer
5 - x: Das Bild als bytes
x + 1: Endmarkierung (--myboundary)


Ich habe jetzt 2 Threads und 1 Synchronizied LinkedList um diesen Stream zu bearbeiten:
Der erste Thread liest den Zeitstempel und merkt sich den (um nachher evtl. zu warten falls video weniger als 5fps hat) und überspringt die nächsten drei zeilen. Danach schreibt er die nachfolgenden Zeilen in einen ByteArray und sucht dabei nach der endmarkierung "--myboundary". Ist die endmarkierung gefunden wird der ByteArray mit Zeitstempel in die LinkedList eingetragen.

Der andere Thread holt sich aus der LinkedList die ByteArrays mit dem Zeitstempel. danach erstellt er mit dem ByteArray das ImageData und damit wiederum das Image. Danach wartet er dann evtl. aufgrund des Zeitstempels um eine stabilen Zeitablauf zu haben (klappt aber wie gesagt nur wenn ich weniger als 5 fps habe bei mehr fps hab ich immer Zeitlupe heißt er wartet nicht sondern müsste eigentlich in die vergangenheit) und zeigt das bild dann an.

Jo hoffe es war verständlich

gruß
Mathias
 
Ahh vergessen zu sagen:
Ich hab auch probiert zwischen den beiden Threads noch einen Dritten einzubauen, einer der sich nur Darum kümmert die ByteArrays in ImageDatas umzuwandeln so das der AnzeigeThread wirklich nur noch anzeigen musste.
Diese hat aber leider nichts gebracht (wurde aber auch nicht langsamer)

Und ich kann auch mit ziemlicher sicherheit sagen, dass das Problem beim aufbau des Image liegt und nicht am Strom, da die LinkedList immer mit den Arrays gefüllt war, bis keine neuen Mehr kamen.
 
Zuletzt bearbeitet:
Zurück