![]() |
25mal / Sekunde Screenshot machen
Hallo!
Wie kann ich 25mal / sekunde daher 25fps mal einen Screenshot meines PC`s machen? Deie Screenshotfunktion ist diese:
Delphi-Quellcode:
procedure ScreenToFile(aFileName: string);
var Bitmap: TBitmap; JPG : TJPEGImage; Canvas: TCanvas; begin Canvas := TCanvas.Create; try Canvas.Handle := GetWindowDC(0); try Bitmap := TBitmap.Create; JPG := TJPEGImage.Create; try Bitmap.Width := Screen.DesktopWidth; Bitmap.Height:= Screen.DesktopHeight; Bitmap.PixelFormat := pfDevice; BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred( Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft, Screen.DesktopTop, Bitmap.Canvas.CopyMode); JPG.Assign(Bitmap); JPG.SaveToFile(aFileName); finally Bitmap.Free; JPG.Free; end; finally ReleaseDC(0, Canvas.Handle); end; finally Canvas.Free; end; end; |
Re: 25mal / Sekunde Screenshot machen
Das ganze in einen Timer packen??!?
Ist aber sicherlich sehr ressourcenfressend... MfG Florian :hi: |
Re: 25mal / Sekunde Screenshot machen
mit der function garnicht....das von der leistung her nicht möglich...
gruß ixtreme.de P.S. Wieso gerade 25 mal pro Sekunde? |
Re: 25mal / Sekunde Screenshot machen
Zitat:
|
Re: 25mal / Sekunde Screenshot machen
Ok weiß wer einen andere Möglichkeit`?
|
Re: 25mal / Sekunde Screenshot machen
das dürft nicht allzuleicht sein. Willst du es selber proggen, oder würde dir entsprechende Software reichen?
|
Re: 25mal / Sekunde Screenshot machen
Nein ich möchte es selber machen.
Muss doch irgendwie gehen. Kann man zBSP. 25 mal die Druck-taste senden? |
Re: 25mal / Sekunde Screenshot machen
Hi, ich habe das selbe Problem, und fand bisher keine Lösung die man selbst machen könnte. Ich bin deshalb auf Camtasia ausgewichen, das geht noch halbwegs von der CPU-Belastung. Bei großen AUflösungen und 25fps geht aber selbst Camtasia in die Knie ! Ich arbeite deshalb mit 15 fps, was für meine Zwecke auch völlig reicht.
Wenn noch jemand anderes dazu eine Idee hat wäre ich auch sehr interessiert ! |
Re: 25mal / Sekunde Screenshot machen
Die CPU Belastung wäre mir egal. Ich müsste nur einmal eine Möglichkeit finden um genau 25 screenshots / sek. zu machen
|
Re: 25mal / Sekunde Screenshot machen
Die CPU Last ist in dem Fall schon wichtig. Wenn die CPU nicht genug leistet, kannst Du entweder keine 25 Bilder machen, oder aber du kannst gerade mal 25 Bilder/sek machen, dafür macht der Rechner aber nix mehr anderes und Du hast 25 mal das gleiche Bild. Dann würde aber auch einer reichen ;-)
|
Re: 25mal / Sekunde Screenshot machen
Ich würde es mal mit einem Thread probieren, aber die Priorität runtersetzen.
|
Re: 25mal / Sekunde Screenshot machen
Wieso runter? Wenn dann doch rauf! Wenn es schon bei normaler Prio nich klappt dann wohl erst recht nich mit na kleinern oder?
Was ich machen würde wär das ganze erst mal in nen MemoryStream schreiben, so sparst du die Zeit um das ganze auf die Platte zuschreiben ... bringt warscheinlich nich viel aber nen bissel könnte es bringen. |
Re: 25mal / Sekunde Screenshot machen
Nein runter. Damit man mit dem System noch arbeiten kann. Bei sekündlichen Screenshots, konnte man mit meinem System schon nicht mehr arbeiten.
|
Re: 25mal / Sekunde Screenshot machen
Ja schon nur dürfte es dann auch keine 25 Screens geben ... ich seh schon wir haben nen Problem ...
|
Re: 25mal / Sekunde Screenshot machen
Man muss eben einen Kompromiss fiden.
|
Re: 25mal / Sekunde Screenshot machen
Ich halte ja die 15 für ganz gut aber er will ja unbedingt die 25. Kann man denn nich per DX gleich von der Grakaschnittstelle mit "filmen"? Das is wohl die einzige Möglichkeite da wenigstens ne variable Zahl an Screens zubekommen.
|
Re: 25mal / Sekunde Screenshot machen
Keine Ahnung DX ist nicht mein Bereich.
|
Re: 25mal / Sekunde Screenshot machen
Ich hatte mal n tool, dâ konnte man
einen Bereich auf dem Bildschirm markieren, und dann hat es von diesem Bereich n Avi-Video erstellt. Vielleicht bietet indows ja ne Funktion, den "Bildschirm" auf dein Programm "zuleiten". geht bei der soundkarte ja auch... |
Re: 25mal / Sekunde Screenshot machen
Na ja, das kopieren an sich geht ohne Zeitverlust (< 1ms). Wenn du also dafür sorgst, dass 40 mal pro Sek. in eine Bitmap kopiert wird, schaffst du 25 frames/s. Das Problem ist das Speichern und das Anlegen der Variablen (speichern >> anlegen der Var).
Du musst halt vorher (Anzahl der sek. * 40) Bitmaps erstellen und auf die dann immer nur das kopieren anwenden. Und wenn du damit fertig bist, dann speichern. Eventuell kannst du dass Speichern nebenher mit einem Thread mit niedriger Priorität erledigen. |
Re: 25mal / Sekunde Screenshot machen
Hallo,
@kurtm1 hat Deine Grafikkarte einen Videoausgang ? (Videorekorder) An welche Aufnahmelaufzeiten denkst Du "Sekunden, Minuten, Stunden, Tage" In Abhängiglkeit davon würde ich mir erstmal Gedanken darüber machen wie Du die Datenmenge auf Seite schieben kannst. Deinen Code kann man noch optimieren einmalig die Objekte erzeugen Funktionen wie Screen.DesktopWidth, Screen.DesktopHeight oder GetWindowDC(0) außerhalb der function ScreenToFile ermittlen und als Register-Variable speichern Dann Laufzeitmessungen (Geschwindigkeit) durchführen über BitBlt (h, 0, 0, w, ... dann ermitteln ob es an der Grafikkarte liegt oder am Treiber Die Auflösung (Ausschnitt) wurde ebenfalls angesprochen reicht eine 640x480 oder muss es wirklich 1280x1024 sein ? Erst mal alle technischen Probleme angehen bevor man wirklich sich zu tote hackt und dann nur noch Assembler der letzt Ausweg ist Gibt es ähnliche Hardcopy-Routinen bei DirectX oder OpenGL ? und wie wird dort das Streaming realisiert. Vom TTimer würde ich die Finger lassen und eher einen eigenen MultiMediaTimer schreiben oder bei Torry suchen. Früher :-D unter dem guten alten DOS :) konnte man direkt auf den Bildspeicher zugreifen, gibt es unter Win32 die Möglichkeit den Speicher (Pages) der Grafikkarte direkt auszulesen ? (Achtung Synchronisation ((hier sind dann wieder die Threads gefragt)) ) ansonsten muss man sich in die Treiber-Entwicklung von Microsoft einarbeiten ist dann hier ein Win9x-System besser als ein abgeschiermtes NT, 2000 oder XP ... naja, viele Fragen |
Re: 25mal / Sekunde Screenshot machen
Hallo!
Die Ausgänge auf der Graka habe ich aber geht darum ein digital Video aufzunehmen. Länge: sekunden bis wenige Minuten. Wie kann ich eine Laufzeitmessung machen? 640*480 wäre auch gut |
Re: 25mal / Sekunde Screenshot machen
Hallo,
Zitat:
und entscheiden ob Du zuerst alles im Arbeitsspeicher einlesen möchtest und danach die einzelnen Sache (Bilder/Frames) abarbeiten möchtest oder ob Du über einen FileStream gleich auf Platte schreiben willst ... Zitat:
anfang := Time; // mach was ende := Time; diff := ende - anfang; aber das ist viel zu ungenau ... auch der GetTickCount ist nur im 10ms Bereich genau, verwende den QueryPerformanceCounter da bekommst Du im 1ms Bereich genaue Zeiten geliefert
Delphi-Quellcode:
was mir noch eingefallen ist, in der Spiele-Entwicklung wird nicht jedes Pixel ausgelesen
var liStart : TLargeInteger;
var liEnd : TLargeInteger; var liDiff : TLargeInteger; var b : Boolean; var liFreq : TLargeInteger; var dTime : Double; begin b := QueryPerformanceFrequency (liFreq); b := QueryPerformanceCounter (liStart); // START Zeitmessung Sleep (513); // für Dich ist hier der BitBlt-Aufruf zu verwenden // ENDE Zeitmessung b := QueryPerformanceCounter (liEnd); liDiff := liEnd - liStart; // Zeit in Sekunden dTime := liDiff / liFreq; entweder jede zweites Pixel oder jede zweite Zeile auch die game-entwickler haben Tricks, vielleicht wäre die vorgehensweise über diesen Bereich effizienter |
Re: 25mal / Sekunde Screenshot machen
@trifid:
Das bringt mich (für mein Problem) auf eine Idee: Gibt es denn eine Möglichkeit festzustellen, dass sich auf dem Bildschirm etwas geändert hat ? Dann könnte man einfach bei jeder Änderung einen Screenshot machen, und nebenbei die Zeit protokollieren und später die entprecheden Frames einfach mehrmals hintereinanderschreiben ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz