[Suche]Videotransfer

02/23/2015 22:46 FacePalmMan#1
Hallo liebe EPVP Nutzer. Kurz und knapp:
Ich will ein Programm mit Videoübertragungsfunktion machen, was mir aber nicht glingt (b.z.w. mit 0.5FPS), da ich dauerhaft screenshots machen & sie (ganz) zum server übertragen muss.
Was ich brauche: Eine Methode um 2 Bilder zu vergleichen (Alt + Neu) und die sich unterscheidenden Pixel in einer 3. Datei zu speichern.

Vielen Dank schonmal im Voraus.
02/23/2015 22:55 alpines#2
Der Weg wie du deine Screenshots machst ist das Problem. Du speicherst sie auf der HDD statt als Image-Stream direkt loszuschicken.
Du könntest auch HyperCam 3 bsp.-weise nehmen und zwei Sekunden im voraus mit low-Bitrate aufnehmen und dann Chunk für Chunk transferieren.

Wenn du Pixel mit Pixel vergleichen willst ist AutoIt die falsche Wahl, da es zu langsam ist.
Du kannst ja mal versuchen eine DLL in C# zu coden und sie dann zu callen. Ist wesentlich schneller.
02/24/2015 02:05 warfley#3
Du willst also einerseits wissen wie man Programme als Systemuser in den Autostart hängt zum anderen wie man Screen Mirroring macht? Man könnte böses vermuten.

Aber nun gut. Du musst etwa folgendermaßen vorgehen, du schnappst dir per GDI das Canvas des Desktop Handles, kopierst dann den Inhalt auf ein anderes Canvas der selben größe. Dann kopierst du einen Teil davon (z.B. 200x200 px) und überprüfst dieses mit der alten Stelle (Pixel by Pixel mit GDI). Wenn die änderung über einem Toleranzwert (z.b. 1%) ist schickst du dieses an den Clienten.

Wenn du lust und Laune hast, kannst du auch noch die Daten komprimieren, z.B. über gzip.


Nun Screen Mirroring ist nicht leicht, das ordentlich und Performat hinzubekommen, dafür gibt es die eigentlich schon fertig entwickelten und auch sehr guten lösungen wie vnc. Dass du das ordentlich hinbekommst, und dazu noch in Autoit bezweifle ich. (Entweder wird es nicht schnell sein, oder du lässt die Prozessorleistung in die höhe schießen, mal davon abgesehen wie unsicher das ganze wird).
02/24/2015 16:20 FacePalmMan#4
Quote:
Originally Posted by alpines View Post
Der Weg wie du deine Screenshots machst ist das Problem. Du speicherst sie auf der HDD statt als Image-Stream direkt loszuschicken.
Du könntest auch HyperCam 3 bsp.-weise nehmen und zwei Sekunden im voraus mit low-Bitrate aufnehmen und dann Chunk für Chunk transferieren.

Wenn du Pixel mit Pixel vergleichen willst ist AutoIt die falsche Wahl, da es zu langsam ist.
Du kannst ja mal versuchen eine DLL in C# zu coden und sie dann zu callen. Ist wesentlich schneller.
Die Sache mit dem direkt loszuschicken kann ich schnell machen (danke für den Hinweis).
Das mit der Hypercam kann ich vielleicht versuchen. Nur ist die Frage, ob wenn ich eine Datei für die Avi control angebe, ob sie dann trotzdem konstant gelesen & geupdated wird, oder ob es nur den schon vorhandenen Clip nimmt.


Quote:
Originally Posted by warfley View Post
Du willst also einerseits wissen wie man Programme als Systemuser in den Autostart hängt zum anderen wie man Screen Mirroring macht? Man könnte böses vermuten.

Wenn du lust und Laune hast, kannst du auch noch die Daten komprimieren, z.B. über gzip.
Ich hab schon NJRat, also was würde ich bitte für "böses" mit AutoIt schreiben wollen?

Die Idee mit gzip gefällt mir. Das baue ich direkt in den Server rein.

€dit: Ich versuche es jetzt von JPG auf GIF umzuschreiben, da GIF ein sehr kompaktes Bildformat ist.
02/24/2015 17:17 alpines#5
Du kannst auch einfach ein WMPlayer.ocx Objekt nehmen und die Videodaten abspielen. Während die eine abgespielt wird wird die andere schonmal geladen und das Control dann ersetzt wenn es fertig ist wenn es zu lange wartet zwischen zwei Dateien.
02/24/2015 19:45 FacePalmMan#6
Ich hab das mit dem BMP format umgesetzt + auf 1000x500 reduziert, was die Bilddateien auf 58kb reduziert (vorher 270kb @ ~0.5 FPS, nun ((270*0.5) / 58) 2,3 FPS).

Doch leider habe ich jetzt ein Problem, und zwar kommt statt dem normalen binarylen Wert ein binärer String an. Natürlich bin ich nicht dumm und habe es mit Int und BinaryToString versucht, was aber keine richtigen Ergebnisse erzielt hat.
02/24/2015 19:50 alpines#7
Am besten Base64-Decodest du das ganze wenn du das schickst, dann sollte der String gleichbleiben.
02/24/2015 20:21 FacePalmMan#8
Quote:
Originally Posted by alpines View Post
Am besten Base64-Decodest du das ganze wenn du das schickst, dann sollte der String gleichbleiben.
Schon gelöst.
Code:
String($BinaryLen)

€dit:
Ist 1 Fehler behoben, taucht der Nächste auf.
Das Übertragen von BMP dateien läuft nicht so wie geplant. Es bleiben
immer ~90% ausstehend (z.b 48087/48169).
Bei normalen Dateien funktioniert es einwandfrei!

€dit:
TcpSend meint immer es würde den ganzen String auf einmal übertragen haben, was aber nicht stimmt.
ALLES funktioniert normal, nur BMP dateien wollen nicht übertragen werden.