Bildschirm übertragung

07/31/2014 13:24 Doktor.#1
Hey,
Ich bin momentan dabei eine Art Bildschirm Übertragung zu machen, leider bin ich mir nicht sicher ob ich es richtig angegangen bin, momentan mache ich einfach "Screenshots" und sende die an das andere Programm. Gibt es dort effizientere Methoden? Arbeite mit C++ | Qt

Funktioniert ja momentan alles tadel los, nur ist der Datenverkehr ziemlich hoch, auch wenn ich es vorher schon komprimiere, d.h. umso größer die Auflösung umso verzögerter kommt das Bild an..

Mfg.
Doktor.
07/31/2014 13:43 Jeoni#2
Vermutlich gibt es da bessere Möglichkeiten (noch nicht eingehend mit beschäftigt, aber vielleicht sind meine Ansätze ja trotzdem etwas nützlich). Und was für eine Kompression legst du zur Zeit an? Eine nicht verlustbehaftete allgemeine Kompression, wie beispielsweise lzma(2) oder gzip?
Nicht umsonst wurden gefühlte tausende Videocodecs (mp4, mpg, etc.) erfunden, die man streamen könnte. Die sollten den Datenverkehr stark reduzieren können, brauchen aber halt Performance für's En- und Decoding. Zudem wüsste ich so ad hoc keine einfache Möglichkeit den Bildschirm aufzunehmen, außer das Abfangen in einer Art, die man auf für Hardwareoverlays nutzt, hab mich damit aber auch nicht wirklich beschäftigt. Nun, es ginge noch aus Einzelbildern einen Videostram hinzukriegen, aber auch da keine Ahnung, wie die Performance wäre.
Wenn man bei Einzelbildern bleibt, könnte man sie verlustbehaftet in unterschiedlicher Qualität (bspw. je nach der Verbindungsqualität) beispielsweise in JPGs konvertieren. Das kostet natürlich auch wieder etwas performance, aber das wird sich rentieren, schätze ich.
Sowohl bei Videos, wie auch bei Bildern könnte man natürlich noch die Auflösung herunterskalieren, um den Datenverkehr zu reduzieren.
Für alles, was ich hier angesprochen habe, sollte es eigentlich schon irgendwelche Libraries geben, die du nutzen kannst, wenn das nicht schon in Qt mit enthalten ist (Bilder konvertieren könnte drin sein?).

Ich hoffe, ich konnte helfen oder wenigstens Ideen liefern ;)
Jeoni
07/31/2014 13:43 Terreox#3
Eine Alternative wäre das RDP Protokoll.
Noch nie damit gearbeitet in einem Projekt, aber hab FreeRDP als mögliche Bibliothek gefunden:
[Only registered and activated users can see links. Click Here To Register...]

Performancetechnisch ist RDP auf jedenfall um einiges schneller, da nicht einfach nur stumpf Bilder von A nach B gesendet werden.
Vielleicht hilft dir das ja etwas weiter.
08/01/2014 13:29 MrDami123#4
Vergiss nicht die übertragenden Daten zu verschlüsseln! ;)
08/02/2014 03:05 warfley#5
du machst screenshots, unterteilst diese dann in kleine teile (z.b. 200x200 px) diese überprüfst du mit den alten nach änderungen, wenn sie sich geändert haben komprimierst du diese und versendest sie übers web (oder ohne komprimierung, normalerweise sollte nicht allzuviel traffic übertragen werden)
Alle paar Bilder sollte aber auch ein keyframe aufgenommen werden, der das gesamte Bild abbildet, um anzeigebugs zu verhindern.

wenn es die möglichkeit gibt screenshots ohne cursor zu machen (bin mir nicht mehr sicher ob das geht) dann mach diese und übertrage seperat die cursor position, somit sparst du auch traffic