Hallo,
ich arbeite gerade daran, einen Windows-Screen zu "recorden", welches
dann ein downscaling auf 320*240 (RGB 5:6:5) um es dann per UDP an einen
uC zu streamen der das auf einem Display anzeigt.
Ich habe das mal testweise in C# implementiert und funktioniert soweit,
allerdings dauert ein FPS (snapshot+per UDP wegsenden) fast an die
100ms!
Kennt ihr evtl. eine fertige Video-streamer Software die das machen
kann?
Gesendet wird das ganze dann unkomprimiert über Ethernet in 128 kleinen
UDP Paketen zu je 1200 bytes. Damit kommt man dann auf die 320*240*2
bytes.
Danke
VNC gibt es seit Jahrzehnten und ist quelloffen und
plattformübergreifend. Das macht die Übertragung intelligenter und
wahlweise auch komprimiert.
Das Protokoll ist in RFC6143 beschrieben.
fchk
Hast du mal mit einem Profiling-Tool geschaut, wo die meiste Zeit
vertrödelt wird?
Mal ins Blaue geraten: verwendest du zufällig die Bitmap-Klasse aus dem
Framework, und davon die Methoden SetPixel(..)/.GetPixel(..)? Die sind
gegenüber dem direkten Zugriff auf den Speicher einfacher zu verwenden,
aber deutlich langsamer. Zum Lesen:
https://docs.microsoft.com/en-us/dotnet/api/system.drawing.bitmap.lockbits
UDP schrieb:> Ich share hier grad mal den code.. Mal gespannt ob es klappt.> Das ist quasi die Routine die das alles einmal macht.>> Bitmap printscreen2 = new Bitmap(1600, 1200);> for (int i=0; i<128; i++) {> Buffer.BlockCopy(TftData,0+i*1200,txbuffer,0,1200);> txbuffer[1200] = (byte) i;> udpClient.Send(txbuffer, 1201, "192.168.0.55", 5200);> }
Wie willst du einen Bildschirm mit 1600x1200 in 128 Teile a 1201 Byte
übertragen?
Kenne die beteiltigten Libraries nicht, aber das Grabben und die
Konvertierung sieht extrem ineffizient aus (insb die BMP-Konvertierung
und der MemoryStream zwischendrin).
Außerdem: UDP hat keine Bandbreitenverwaltung - wenn Pakete schneller
ankommen als sie verarbeitet/weitergeleitet werden können, werden sie
einfach weggeschmissen. Du schickst alles in einem Burst ...