Duplication API -> schnelle Screenshots

  • Hi zusammen,

    hallo UEZ,

    ich werkele schon einige Jahre (mit vielen arbeitsbedingten Unterbrechungen) an Deskstream, einem schnellen Programm zur Übertragung von Bildschirminhalten übers Netzwerk in Echtzeit.

    Teamviewer macht das auch, aber arschlangsam....jedenfalls in der damaligen Version :o)

    Problem u.a. war das Screenshotten in einer halbwegs guten Geschwindigkeit. Alles was mit GDI(+) zu tun hat, fällt damit schon mal raus, in den letzten Jahren hatte ich dazu schon etliches gepostet.

    Nach bissl rumsuchen stolperte ich über die Interface-getriebene Microsoft Duplication API . Diese transferiert Bildschirminhalte in den Speicher, sobald sich auch nur ein Pixel geändert hat. Wenn sich nichts ändert, gibt es auch keinen neuen Screenshot! Die Geschwindigkeit ist im Vergleich zu anderen Methoden atemberaubend, ich habe eine Bildschirmauflösung von 2560x1440 und kann problemlos bis zu 120 Frames pro Sekunde an meinem Desktoprechner aufnehmen...

    Auf einem Uralt-Win10-Tablet (Acer Switch10 von 2014) grabbe und blitte ich den Bildschirminhalt mit bis zu 55fps...wenn der Bildschirm gedreht wird, erkennt die API das und "dreht" mit.


    Was ich als Beispielcode zur API vorfand, auch orginaler M$-Code, war gelinde gesagt eine Katastrophe und meist nicht (richtig) lauffähig. Die Interfaces waren teilweise falsch beschrieben, Implementierungen von Funktionen haarsträubend...nur sehr wenige Beispiele haben mehr als einen Frame gecaptured.....

    Egal, ich habe mich reingekniet und hatte nach einigen Monaten(!) lauffähigen AutoItcode. Das schwierigste war die Implementierung und Umsetzung der Interfaces. Dabei habe ich etliche Optimierungen zu den Beispielcodes herausgefunden, die wichtigste Optimierung war imho, dass ich (entgegen ALLER verfügbaren Beispiele und Programme) nur EINMAL sämtliche Pointer und Interfaces initialisiert habe, statt ständig in einer Schleife alle Pointer und Interfaces für jeden einzelnen Frame neu zu initialisieren....wieso ist das noch keinem anderen Programmierer auf der Welt aufgefallen?!

    Anbei ein kleines Beispiel.

    Es wird eine GUI erstellt in welche der aktuelle Bildschirminhalt geblittet wird. Die GUI verändert Ihre Größe und parallel dazu auch den Zoom des Desktops. Dank D2D/D3D-Anbindung (auch der API) funktioniert das auch in nativem AutoItcode sehr flott. Da NUR GEÄNDERTE Bildschirminhalte von der API erfasst werden habe ich so etwas Bewegung auf den Screen gebracht. Man merkt sofort den Unterschied in den FPS, wenn man die Maus bewegt, dann steigt die FPS von 60-75 (ich habe einen 75HZ Monitor) auf über 120 FPS....

    Wer mag, kann ja mal "nebenbei" ein 4K HDR-Video auf Youtube im Fullscreen laufen lassen und dabei die AutoIt-GUI einblenden.

    Programm wie immer bei mir etwas chaotisch :o), Fragen dazu gerne, ich habe die letzte Version vor 3 Jahren bearbeitet 8) Es wird aktuell das erste von der API gefundene Device (Monitor) benutzt, das kann aber bei Multimonitorsystemen eingestellt werden.

    Die API-Funktionen, wie immer bei mir, NICHT in einer der "schönen" UDF-Versionen (wo ist der "Fuck off"-Smilie:saint:)

    DUP-API.zip

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (27. August 2025 um 09:58)

  • Hi Andy,

    ich sehe nur ein schwarzen Bildschirm. Irgendwas scheint da nicht zu laufen.

    Edit: scheint daran zu liegen, wenn mehr als ein Monitor vorhanden ist. Bei einem Monitor funktioniert's.

    Ansonsten tolle Arbeit! :thumbup:


    Desktop Duplication API ist die ältere Capturing API - die neue heißt Windows Graphics Capture API (WinRT).

    Unterschiede:

    FeatureDesktop DuplicationWinRT Capture API
    Fenster-capture
    Monitor-capture
    Region-capture
    Cursor-Erfassung❌ (selbst implementieren)✅ (ein-/ausschaltbar)
    Multi-Threadedteilweise
    Modern & Win10+ Optimiert
    Einfachheit für Win32/UWP

    Nachteil von WinRT: nur Windows 10 Version 1803+ und Windows 11.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (25. August 2025 um 20:11)

  • Hehe, naja, "ältere API", das Posting ist einige Jahre zu spät (Orginal ist von 2021^^) ...:rofl: egal, Deskstream läuft in Autoit als Client/Serveranwendung, captured "natürlich" auch Fenster und Regions und nutzt eine OpenCL-basierte BC1-Kompression und Dekompression.

    Alles nativer AutoIt-Code (bis auf eine Handvoll Bytes Maschinencode fürs Decompress :P(MUSS sein)) , lokal auf einer Maschine (Netzwerk = loopback Adapter 127.0.0.1) werden 60 FPS in 1440p "übertragen". Übers WLAN sind immer noch stabile 30+ FPS drin, das reicht um x-beliebige Bildschirminhalte auf bspw. einen Fernseher zu streamen (soviel zum "geschützten" 1&1-TV im Browser....)


    Zur WinRT Capture API:

    Habs jetzt nur oberflächlich betrachtet, aber D3D-Anwendungen waren doch schon immer dafür bekannt, keine "geschützten" Modi aufnehmen zu können?! DRM-gesicherte Anwendungen, Spiele, usw? Geht das jetzt mit der WinRT?

    Weiterhin bin ich mit deiner Liste nicht einverstanden! ALLE von dir mit der DUP-API (nicht) angehakten Punkte sind ausschließlich NACH dem Screencapture ausgeführte D3D-Funktionen...bis auf den Cursor, den kann man bei der DUP-API auch per Flag nicht mit aufnehmen, der hat mich auch einiges an Nerven gekostet, da der Cursor extra "bearbeitbar" ist.

    Dirtyregions und movedregions sind als ebenfalls schon in der API abfragbar...

    Einfachheit für Win32/UWP

    made my Day:rock:....aber da werde ich wie seit Jahrzehnten wieder auf Unverständnis seitens der Programmiererzunft stoßen. Der einzige Grund, wieso "Programmieren" so kompliziert war und immer noch ist, ist die Profilneurose und Featuritis der Programmierer(zunft). Wieso müssen immer und immer wieder etliche Funktionen und Aufrufe getätigt werden, um eine simple und milliardenfach abgefragte Aufgabe abzuwickeln? Ist da niemand in der Lage, einen Wrapper zu schreiben, der die Aufgabe in einer Zeile Code abliefern kann? Stattdessen schreibt einer vom anderen ab (heutzutage c&p), produziert millionenfach immer die gleichen Zeilen Code und wundert sich dann, wieso sein Job von einer strunzdummen, wahrscheinlichkeitsoptimierten "KI" übernommen werden kann....und wer jetzt quiekt sollte sich fragen, wieso mittlerweile Jahresgehälter im acht- bis neunstelligen Bereich für talentierte "KI-Forscher" bezahlt werden. Wieso wird deren Job nicht von einer KI übernommen:saint:?

    Um meinen Punkt klarzustellen:

    Ich hätte MONATE (zugegeben in ein "Hobby") investierte Zeit sparen können, wenn ich in AutoIt eine Funktion des Betriebssystems(!) hätte aufrufen können die da lautet

    $ret = _DuplicationAPI_CaptureNextFrame()                         ;sets $tFrameData.PointerToPixel and $tFrameData.SizeOfPixels

    OHNE tausende Zeilen *.h-Files und Interfacebeschreibungen per eigens dafür geschriebenen AutoIt-Script "automatisch" in AutoItcode überführen zu müssen. Und dazu noch hunderte Zeilen Code um imho völlig sinnlos hunderte Unterfunktionen aneinanderreihen zu müssen...

    Und wenn ich die zugegeben nur oberflächlich verfolgten Threads zu deiner Umsetzung der WinRT Capture API verfolge, ist das bei dir ähnlich....soviel zum Thema EINFACHHEIT;),


    So wie das für mich aussieht, ist bei der WinRT Capture API ausschließlich Multithreading ein Feature, wieso das jemand aber bei einer Capturezeit in AutoIt (hust hust) von teilweise weit weniger als einer Millisekunde (reine Capturezeit) braucht, sei dahingestellt. weiterhin ist das auch keine "Low-Level" DXGI Anwendung?! Kommt mir vor wie von M$ gegängelt um als "modern" = "eingeschränkt" = "Win11-konform" = "nicht Low-Level" in die Anwendungen gedrückt zu werden

    Viel interessanter in diesem Zusammenhang ist, dass in den Prozessor integrierte GPUs (also APU´s) einen enormen Geschwindigkeitsvorteil haben, da der Speicherbereich einer "externen" Grafikkarte nicht mehr grottenlangsam ;) per DMA ins RAM transferiert werden muss, sondern dort direkt im Zugriff ist. "Fette" Prozessorcaches lassen zusätzlich Grüßen....

    ich sehe nur ein schwarzen Bildschirm. Irgendwas scheint da nicht zu laufen.

    d3d11 autoit_orginal plus 25 rendern nur gpu TEST APU.zip funktioniert? Deine Bildschirmauflösung?

    Habe eben gerade meine heute erhaltene APU im Ryzen 9600X getestet, die wollte bei bestimmten GUI-größen auch nicht rendern...ich vermute, ich habe wieder mal für die sich ändernde GUI-Größe im Beispiel die Bitmapgrößen nicht als 32-Bit-Vielfache berechnet....dann wird nicht gerendert. Schon blöd, wenn uralte Hardware toleranter gegen "Programmierfehler" ist, wie neues Zeugs:D

  • d3d11 autoit_orginal plus 25 rendern nur gpu TEST APU.zip funktioniert? Deine Bildschirmauflösung?

    Leider immer noch nicht. Wieder nur schwarze GUI. Auf der Arbeit habe ich insgesamt 3 Monitore, 1920x1080 + 2x 1920x1200 -> 5760 x 1200.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Anscheinend wird ein falsches Device ausgesucht:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Anscheinend wird ein falsches Device ausgesucht:


    *EDIT*

    Ja, das letzte gefundene wird verwendet...incl. des Bildschirms/Screens....das ist das aktuell verwendete, d.h. die "aktuelle Grafikkarte (oder APU/GPU)"

    Ich ändere das mal testweise auf das erste gefundene Device, das sollte immer funktionieren

    TEST padapter DUP-API Example GPU APU .zip


    Ok, habe jetzt die Framegrößen (GUI- und Buffer-Größen) auf 64-Pixel Grenzen erweitert (256 Byte Alignment statt 16 Byte Alignment). s. dazu auch hier https://asawicki.info/news_1726_secr…ource_alignment

    In den "früheren" D3D-Versionen war das imho noch nicht so krass...Normalerweise kümmert sich der Treiber ums Alignment.:/

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    4 Mal editiert, zuletzt von Andy (27. August 2025 um 10:44)