Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 25mal / Sekunde Screenshot machen (https://www.delphipraxis.net/13219-25mal-sekunde-screenshot-machen.html)

kurtm1 13. Dez 2003 20:56


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;

flomei 13. Dez 2003 20:57

Re: 25mal / Sekunde Screenshot machen
 
Das ganze in einen Timer packen??!?
Ist aber sicherlich sehr ressourcenfressend...

MfG Florian :hi:

ixtreme 13. Dez 2003 20:58

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?

Chewie 13. Dez 2003 21:01

Re: 25mal / Sekunde Screenshot machen
 
Zitat:

Zitat von ixtreme
P.S. Wieso gerade 25 mal pro Sekunde?

Weil das die Bildrate bei uns im Fernsehen ist, so hast du ein flüssiges Video.

kurtm1 13. Dez 2003 21:29

Re: 25mal / Sekunde Screenshot machen
 
Ok weiß wer einen andere Möglichkeit`?

nailor 13. Dez 2003 21:48

Re: 25mal / Sekunde Screenshot machen
 
das dürft nicht allzuleicht sein. Willst du es selber proggen, oder würde dir entsprechende Software reichen?

kurtm1 13. Dez 2003 21:52

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?

iamjoosy 13. Dez 2003 21:56

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 !

kurtm1 13. Dez 2003 21:58

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

Phoenix 13. Dez 2003 22:23

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 ;-)

Luckie 13. Dez 2003 22:32

Re: 25mal / Sekunde Screenshot machen
 
Ich würde es mal mit einem Thread probieren, aber die Priorität runtersetzen.

BungeeBug 13. Dez 2003 22:38

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.

Luckie 13. Dez 2003 22:40

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.

BungeeBug 13. Dez 2003 22:46

Re: 25mal / Sekunde Screenshot machen
 
Ja schon nur dürfte es dann auch keine 25 Screens geben ... ich seh schon wir haben nen Problem ...

Luckie 13. Dez 2003 22:56

Re: 25mal / Sekunde Screenshot machen
 
Man muss eben einen Kompromiss fiden.

BungeeBug 13. Dez 2003 22:59

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.

Luckie 13. Dez 2003 23:00

Re: 25mal / Sekunde Screenshot machen
 
Keine Ahnung DX ist nicht mein Bereich.

MrKnogge 14. Dez 2003 01:15

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...

Der_Unwissende 14. Dez 2003 12:58

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.

trifid 14. Dez 2003 13:40

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

kurtm1 14. Dez 2003 14:10

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

trifid 14. Dez 2003 15:10

Re: 25mal / Sekunde Screenshot machen
 
Hallo,

Zitat:

Die Ausgänge auf der Graka habe ich aber geht darum ein digital Video aufzunehmen. Länge: sekunden bis wenige Minuten.
640*480 wäre auch gut
jetzt kannst Du ausrechnen wieviel Speicher Du brauchst (pro Sekunde und für den ganzen Film)
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:

Wie kann ich eine Laufzeitmessung machen?
normalerweise mit
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:
   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;
was mir noch eingefallen ist, in der Spiele-Entwicklung wird nicht jedes Pixel ausgelesen
entweder jede zweites Pixel oder jede zweite Zeile
auch die game-entwickler haben Tricks, vielleicht wäre die vorgehensweise über diesen Bereich
effizienter

iamjoosy 14. Dez 2003 23:43

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