tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
286
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Zerwas Zerwas ist offline Mitglied Bronze
    Registriert seit
    Jun 2004
    Ort
    Deutschland (Berlin)
    Beiträge
    31
    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
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Zerwas Zerwas ist offline Mitglied Bronze
    Registriert seit
    Jun 2004
    Ort
    Deutschland (Berlin)
    Beiträge
    31
    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
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    beschreib deine Implementierung doch ein wenig genauer...

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    Zerwas Zerwas ist offline Mitglied Bronze
    Registriert seit
    Jun 2004
    Ort
    Deutschland (Berlin)
    Beiträge
    31
    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
     

  6. #6
    Zerwas Zerwas ist offline Mitglied Bronze
    Registriert seit
    Jun 2004
    Ort
    Deutschland (Berlin)
    Beiträge
    31
    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.
    Geändert von Zerwas (28.09.05 um 16:36 Uhr)
     

Ähnliche Themen

  1. Transparenz Problem (GC + Image + ImageData )
    Von Soultaker im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 15.04.10, 15:58
  2. ByteArray to ImageData
    Von MySelV im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 11.02.10, 10:21
  3. GIF zu langsam
    Von Octa im Forum Photoshop
    Antworten: 1
    Letzter Beitrag: 25.04.07, 10:31
  4. Explorer langsam, wenn ein Netzlaufwerk langsam
    Von Coalminer im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 15.06.06, 15:58
  5. CPU zu langsam...
    Von MichiStroi im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 20.03.05, 10:32