AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MJPEG Stream anzeigen

Ein Thema von philiph · begonnen am 26. Aug 2014 · letzter Beitrag vom 28. Aug 2014
Antwort Antwort
philiph

Registriert seit: 16. Dez 2008
10 Beiträge
 
#1

AW: MJPEG Stream anzeigen

  Alt 27. Aug 2014, 09:56
Bisher habe ich es mit
Delphi-Quellcode:
jpeg.LoadfromStream(jpegstream);
image1.Picture.Bitmap.assign(JPEG)
und
Delphi-Quellcode:
jpeg.LoadfromStream(jpegstream);
image1.canvas.draw(0,0,jpeg);
versucht. Zum Testen habe ich auch schon versucht es auf das Canvas eines DSPack VideoWindows zu zeichnen, das war aber auch nur marginal schneller, es liegt also nicht an dem TImage. Das ganze wird dann in einem eigenen Thread erledigt, um den eigentlichen Empfang der Daten nicht zu behindern. Wenn es hierfür natürlich eine schenllere Variante gibt, wäre ich für jeden Hinweis dankbar.

Von CUDA/OpenCL würde ich gerne Abstand halten, weil man sich entweder an NVIDIA Hardware bindet oder bei OpenCL damit rechnen muss, dass entweder der Treiber noch keien richtige OpenCL Anbindung hat oder bei einfacheren Grafikkarten die OpenCL Unterstüzung ganz fehlt und dann der OpenCL Kernel auf dem CPU ausgeführt wird. Außerdem wüsste ich auch nicht, dass es bisher einen guten Delphi Wrapper für OpenCL gibt, ich habe bisher immer C++ verwendet, wenn ich was mit OpenCL gemacht habe.

FFmpeg hatte ich auch schon gesehen, leider aber nur recht teure kommerzielle Wrapper(FFVCL) gefunden.

LibVLC sieht aber ganz gut aus, das werde ich mir mal anschauen. Vielen Dank!
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: MJPEG Stream anzeigen

  Alt 27. Aug 2014, 10:08
Du könntest spaßeshalbar noch versuchen das Bild einfach mit MSDN-Library durchsuchenBitBlt() auf den Formular-Canvas zu schubsen. So wahnsinnig große Verbesserung vermute ich da aber leider auch nicht.
Bei so großen Bildern in so schnell wird das Dekodieren an sich vermutlich zumindest auch ein merkbarer Faktor sein, so dass die für Video eigentlich kaum optimierte Variante von Delphis JPEGImage da etwas ins Pumpen kommt.

Ein komplettes SDK für VLC ist natürlich Sahne, damit holt man sich den formatfreudigsten und robustesten Player ins Boot den ich kenne. Hatte da nur vor Jahren mal am Rande aufgeschnappt, dass es da was gäbe, aber mangels Bedarf nie weiter verfolgt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.323 Beiträge
 
Delphi 12 Athens
 
#3

AW: MJPEG Stream anzeigen

  Alt 27. Aug 2014, 11:12
Das Die Jpeg-Komponente im Delphi, besitzt ein interes TBitmap.
Vor Ausgabe wird das Jpeg dahin decodiert und das Bitmap wird dann angezeigt.

Und grade dieses Decodieren schreint recht langsam zu sein.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: MJPEG Stream anzeigen

  Alt 27. Aug 2014, 13:19
Delphi-Quellcode:
uses
  System.Diagnostics
...
var
  LStopWatch : TStopwatch;
begin
   LStopWatch := System.Diagnostics.TStopwatch.StartNew;

   jpeg.LoadfromStream(jpegstream);
   image1.Picture.Bitmap.assign(JPEG)
   // oder
   image1.canvas.draw(0,0,jpeg);

   LStopWatch.Stop;
   Caption := IntToStr(LStopWatch.ElapsedMilliseconds);
Was kommen denn da so wie Zeiten bei rum?
  Mit Zitat antworten Zitat
philiph

Registriert seit: 16. Dez 2008
10 Beiträge
 
#5

AW: MJPEG Stream anzeigen

  Alt 27. Aug 2014, 20:57
Leider lässt sich die Laufzeit so einfach nicht messen, dafür geht es zu schnell das Ergebnis ist immer Null. Wenn man wirklich nur einen Durchlauf messen will, müsste man wohl den Assembler bemühen.
Wenn man es in einer for-Schleife mehrfach ausführt, dann steigt die Ausführungszeit linear mit der maximalen Anzahl der Durchläufe unabhängig von der Art es zu zeichnen.

Das Problem scheint wirklich, dass das eigentliche Dekodieren der Jpegs bei TJPEG CPU basiert arbeitet, was bei einer so hohen Wiederholrate nicht mehr klappt.

Leider habe ich auch noch keine vernünftigen Wrapper für LibVCL gefunden, bei der man ohne weiteres Streams laden kann.
Kennt vielleicht jemand eine Möglichkeit mit DSPack ein Jpeg aus einem Stream zu laden.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: MJPEG Stream anzeigen

  Alt 28. Aug 2014, 09:36
Leider lässt sich die Laufzeit so einfach nicht messen, dafür geht es zu schnell das Ergebnis ist immer Null.
Das kann nicht sein, da muss dir ein Fehler unterlaufen sein.
Bitte kontrolliere das nochmal.
Ggf. schreibe per OutputDebugString ins Event Log, anstatt per Formular-Eigenschaften die Zeit auszugeben.

Da müssen mindestens 1 bis 15 ms bei rum kommen.

Denn wenn die verstrichene Zeit um die 0 ms betragen würde (also sich im Bereich von Nanosekunden bewegt), dann hättest du auch keine Probleme bei einer Bildrate von 30 FPS -> 33 ms von Bild zu Bild.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz