Seite 1 von 2

Screenshots Live Übertragen

Verfasst: 22.02.2007 18:42
von PureBasic4.0
Hi, Leute

Ich möchte einen Livestream des Bildschirms (Server) an einen anderen (im Netzwerk angeschlossenen (Client)) Computer senden, der dann das ganze Live auf den eigenen Bildschirm streamt. Gibt es dafür irgendwelche Codes? Ich brauche eine effiziente Methode, da ich nur begrenzt CPU Leistung dafür verschenken möchte. Mit einem Netzwerk Datendurchsatz von 108 MBit/s dürfte es eigentlich kein Problem darstellen.
Das Ganze möchte ich auch noch mit dem Audiostream machen und einer Webcam. Ist aber erst mal nebensächlich

//Edit: Habe schon die SuFu benutzt, aber nichts gefunden, dass sich einfach in ein Programm einbinden lässt

Verfasst: 23.02.2007 17:03
von PureBasic4.0
hat jemand ne idee?

Verfasst: 23.02.2007 18:12
von a14xerus
ich hab noch nie nen Stream selber ausgelesen geschweige denn geschickt.
Cam Übertragung mach ich immer mit Einzelbildern und einem selbst geschriebenen "Protokoll"

Verfasst: 23.02.2007 18:14
von PureBasic4.0
dauert aber zu lange. Selbst ohne Netzwerk-Übertragung braucht es 100% CPU-Leistung, auch mit Delay(1000/24) - Befehl

Hat sonst noch jemand ne idee?

Verfasst: 23.02.2007 18:15
von a14xerus
bei mir nicht, aber ich denke auch, das das nicht die eleganteste variante ist

Verfasst: 23.02.2007 18:17
von PureBasic4.0
sondern?
Ich benutze den Code aus dem CAV (mit der Procedure MakeDesktopScreenshot)

Verfasst: 23.02.2007 20:33
von AND51
Hier, dingens... Darky hat mal ne Lib geschrieben, die den Zugriff auf eine Cam ermöglicht (siehe Forum). Ich glaube, seine Lib ist sogar PB 4.0 kompatibel (hoffe, ich verspreche dir grad nix falsches).

Verfasst: 23.02.2007 21:16
von PureBasic4.0
aber damit kann man schlecht einzelne bilder aus dem arbeitsspeicher auslesen und per network verschicken

Verfasst: 24.02.2007 16:14
von PureBasic4.0
hat jemand noch irgendeinen code oder ne lib, die man benutzen könnte?
Habe mal den Code aus dem Archiv ausprobiert (MakeDesktopScreenshot()) und diesen über's netzwerk an localhost versendet. Beide (Server und Client) mit Delay(1000/24) Befehlen, aber die CPU-Auslastung sieht so aus (Türkis=Server, Grün=Client):

Bild

--> 100% Benötigte Systemleistung. Möchte aber, dass man den PC ganz normal nutzen kann (z.B.: für anspruchsvolle Spiele)
Möchte aber, dass möglichst wenig Leistung verbraucht wird. Ich muss leider die Screenshots zwischenzeitig (24 Bilder/Sekunde) auf der Festplatte speichern, weil ich das mit MakeDesktopScreenshot() gemachte Bild nicht über den Arbeitsspeicher auslesen und mit SendNetworkData() versenden kann (oder gibt es dafür einen Code?). Das Speichern der Daten auf der Festplatte braucht wahrscheinlich die ganze Leistung, deswegen benötige ich vorerst einen Code zum Speichern und Versenden von Bildern in/aus dem Arbeitsspeicher. Habe das Ganze auch schon mal über SetClipboardImage(#Image) versucht, aber wie soll man das dann über's Netzwerk versenden können?

Verfasst: 26.02.2007 12:35
von dige
Du musst Dir zunächst mal ein geeignetes Protokoll mit Datenreduktion
überlegen.
Zum Bsp. nur die Bildzeilen senden die sich geändert haben und
die schnelle BriefLZ Kompression verwenden.
Das Protokoll könnte dann zum Bsp. so aussehen:
<Long: UnpackSize><Data Container>

Der entpackte DatenContainer könnte dann folgendermaßen aussehen:
<Word:ZeilenNummer><RGB-Array>

Diese Zeilen überschreiben dann das aktuelle Bild.

Evtl. würde ich die Daten nicht mit dem lahmen SendNetworkData()
übertragen, sondern mit ( mir fällt die Bezeichung grad nicht ein )
Network Pipes? machen ...