Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Apr 30, 2025 00:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: ScreenCapture Componente
BeitragVerfasst: Mi Jun 07, 2006 09:41 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Hallöchen,

kennt jemand von euch eine Componente, womit ich mein Desktop oder ein anderes beliebiges Windows-Handle als Video (AVI, ...) aufnehmen kann? Ich habe schon bei Torry.ru geschaut aber dort waren genau eine Componente (tVideoGrabber), die 800-2000 Euro kostet. Find ich z.Z. ein klein wenig zu viel. ^^

Wäre nett, wenn jemand was kennt und nach möglichkeit mit einer kleinen Beschreibung (Source).

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 07, 2006 13:52 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Hab da dieses DSPack von http://www.progdigy.com/ gefunden .. kann das auch vom Screen Videoaufnahmen machen? Konnte das nicht so genau rausfinden.
Ähm .. wenn ja, wie ?

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 07, 2006 14:38 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7809
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du deinen Bildschirm abfilmen willst solltest du dich mal mit dem MS Windows Media Encoder beschäftigen. Ist kostenlos und relativ simple zu bedienen. Ist aber glaub ich nicht unbedingt geeignet einen 3D Shooter aufzuzeichnen, da der glaub ich 15FPS aufzeichnet. Weiß nicht ob man auch mehr einstellen kann.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 07, 2006 14:47 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
naja, 15 Frames sind ja nicht unbedingt viel. Daher denk ich mal das der Media Encoder flach fallen wird. Am besten wäre halt sowas wie der TVideoGrabber halt nur kostenlos, da dieser wunderbar funktioniert hat. Problem liegt ja auch daran, das die Aufnahme den GameGuard umgehen muss und ich nicht direkt auf den Windows-Handel zugreifen kann. (Zumindest vermute ich das).

Es sollte halt alles in einem Programm vereint sein und nicht das man 200 Sachen installieren muss, bevor man was aufnehmen kann. Wer vielleicht noch so eine Komponente rumfliegen hat, die das schafft und die man mir auch überlassen würde, wäre ich sehr dankbar. Natürlich würd ich auch in dem Programm reinschreiben, wem ich die Funktion zu verdanken habe.

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 07, 2006 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
Schon mal FRAPS ausprobiert? Vielleicht brauchst du ja ger keine Komponente ;)

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 07:44 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Ich will das ja aber in meinem Programm mit einbauen. Und Fraps würde auch nicht funktionieren, da das Spiel was ich abfilmen möchte den GameGuard verwendet und Fraps dann auch nicht funktioniert. Wie auch immer .. ich bräuchte eine Komponente oder irgendein Source wo drinnsteht, wie das funktioniert.

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Also erstmal ist es wichtig, dass du über gdi ein Screenshot des fensters machst(schneller als über opengl die pixel zu lesen) und dann kannst du diese Screenshots über VFW.pas es mit ein installierten Codec in ein Video bannen lassen. Es gibt einige sourcecodes dazu, drumm glaube ich du hast nicht wirklich gründlich gesucht hast. Schau mal bei delphi3d.com nach da sollte ein vcl version sein.
Alternativ kannst du auch Screenshots in bmp oder jpeg ablegen und dann im nachhinein mit memcoder in ein video packen. Dies hat den vorteil das du höhere fps erreichst als wenn du das video noch zur laufzeit codierst.

Ich arbeite ab und zu mal ein ein Projekt weiter welches erlaubt avi datein lesen und schreiben zu können, allerdings ohne libs und für alle platformen(nicht nur windows).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 10:05 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Kann man denn mit VfW die Screenshots "on fly" in ein AVI bannen oder werden die Screenshots erst auf Platte gespeichert und erst beim beenden der aufnahme in ein Video-File konvertiert ?
Wenner das als Avi abspeichert sollte es ja wohl keine gravierende Pervormanzverluste geben oder?

Terra

PS: unter delphi3d.com fand ich nichts ordentliches.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 14:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
So bin nun zuhause und hab mal nachgeschaut.
http://www.delphi3d.net/download/avicap.zip liegt in der download section von delphi3d.net.
Die AVI wird zur laufzeit erstellt, AVI ist ein chunkbasiertes Dateiformat und somit ohne probleme zur laufzeit schreibbar.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 09, 2006 09:05 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Also das AviCap ist spitze ... jetzt muss ich nur mal gucken wie ich das mit meinen Intressen verbinde ^^
Aber das bekomm ich bestimmt auch noch hin. trotzdem Vielen Dank.

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 11, 2006 14:04 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Ich habe es jetzt hinbekommen von meinem Spiel eine Aufnahme hinzubekommen. Musste dafür die dotVideo.pas Datei ein wenig umändern.

Code:
  1.  
  2. function dotLoadBitmapFromFrameBuffer(w, h: Integer): HBITMAP;
  3. var
  4.   hdcScreen, hdcCompatible: HDC;
  5.   hbmScreen: HBITMAP;
  6.  wnd: HWND;
  7. begin
  8. //________________________________________________ Hier ist die änderrung !!!
  9.  wnd := findwindow('nil', 'meinSpiel');
  10.  hdcScreen := GetDC(wnd);
  11. //________________________________________________
  12.  
  13.   // Take a snapshot from the capture window, and return it as a HBITMAP.
  14.  
  15.   // Source DC:
  16.                                       //hdcScreen := wglGetCurrentDC();
  17.   // Destination DC:
  18.   hdcCompatible := CreateCompatibleDC(hdcScreen);
  19.  
  20.   hbmScreen := CreateCompatibleBitmap(hdcScreen, w, h);
  21.  
  22.   if hbmScreen = 0 then
  23.   begin
  24.     raise Exception.Create('CreateCompatibleBitmap() failed!');
  25.   end;
  26.  
  27.   if SelectObject(hdcCompatible, hbmScreen) = 0 then
  28.   begin
  29.     raise Exception.Create('SelectObject() failed!');
  30.   end;
  31.  
  32.   if not BitBlt(hdcCompatible, 0, 0, w, h, hdcScreen, 0, 0, SRCCOPY) then
  33.   begin
  34.     raise Exception.Create('BitBlt() failed!');
  35.   end;
  36.  
  37.   DeleteDC(hdcCompatible);
  38.  
  39.   Result := hbmScreen;
  40.  
  41. end;


Allerdingst ruckelt die Aufnahme ohne ende und es werden Frames übersprungen. Ist also nicht so schön wie in der Demo zu sehen ist. Was mache ich denn da falsch?

Hinzu kommt noch das ich in der Auflösung was ändern musste:

Code:
  1.  
  2. procedure TDotVideoRecorder.StartCapture(const name: String; const window: TForm; const fps: Integer);
  3. begin
  4.  
  5.   FName := name;
  6.   //FWidth := window.ClientWidth;
  7.   //FHeight := window.ClientHeight;
  8.   //_______________________________ Damit die volle Bildschirmgröße aufgenommen wird.
  9.     FWidth := screen.width;
  10.     FHeight := screen.height;
  11.   //_______________________________
  12.   FParentWin := window;
  13.   FFrameRate := fps;
  14.  
  15. end;
  16.  


Könnt mir wer da zu Hilfe kommen ?

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 11, 2006 20:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wie oft rufst du das aufnehmen auf und in welchen abständen ?
Richtig wäre wenn du es 25mal aufrufst unszwar in 1000/25=40ms abstand.
Also 0,40,80,120,....,880,920,960,1000,1040,1080.
Desweiterem rate ich nutz eine kompremierung DivX z.B., da unkompremiert dein system langsamer macht.
Grund hierfür ist dann der Flaschenhals Festplattenzugriff.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 12, 2006 08:23 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Bei mir ist es genau so eingestellt mit dem abrufen. Allerdingst hab ich das gefühl, das der ziemlich lange braucht, bis der ein Bild eingespeichert hat. Könnte das am Spiel liegen? oder das ich das Handle aufrufe anstelle die OpenGL-Anweisung, die vorher drinn stand?

hdcScreen := wglGetCurrentDC(); stand ja vorher drinne.

Das mit der komprimierung kann ich nicht bestätigen. Eher umgekehrt, da das Programm ja jedesmal das Bild komprimieren muss und erst dann den nächsten Shot macht. Bie der unkomprimierten Geschichte erhalte ich die besten Werte. (SATA2) ;-)

Wie auch immer ... habs bis jetzt nicht hinbekommen eine relativ flüssige Aufnahme von dem Spiel zu bekommen.
Bitte um Hilfe !!!

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 12, 2006 13:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Alternativ solltest du mal versuchen dein code ohne zeichnen zu compilieren und das zu capturn.
So kannst du wenigstens rausbekommen ob es an der fülle von daten, für die GPU liegt.
Wenn es ohne probs läuft würde ich sagen, a)verringer die auflösung oder komplexität b)zeichne alle bewegungen in einer datei auf und render dann die aufzeichnung frame für frame(q3,hl,hl2 aben ein demorecorder und man könnte damit in ruhe die demo aufzeichnen) c)probieren bis es klappt ^^.
Wglgetcurrentdc() ist ne in opengl implementierte funktion die einfach nur den genutzten device context zurück gibt.
Wenn deine variante auch den korrekten DC zurück gibt ist es wurscht. Ausser die funktion wird immer und immer wieder aufgerufen, also bei jedem shot, dann würde ich zu der opengl funktion raten.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 12, 2006 13:43 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Könnt es auch daran liegen, das ich ein externes Programm "abfilmen" möchte und das Spiel in DirectX läuft ?
PS: Mit glgetcurrentdc() habe ich außerdem eine fehlermeldung bekommen. es ging erst, nachdem ich den handel definiert habe.

Terra


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 15 Queries | GZIP : On ]