Posts ajouté avant le Rollback

Citation Envoyé par Blako_17
bonjour,
je souhaite céer une application qui me permetrai de filmer lécran (juste l'image, le son nimporte pas pour linstant) et denregistrer le résulat dans un format avi

je ne sais pas comment commencer et jaimerai bien quelque piste svp

merci

a biento
Citation Envoyé par sat83
Tu peux t'en sortir en faisant des captures d'écran à intervalle régulier.
Citation Envoyé par sm1z2000
bjr,
Je suis aussi intéréssé par cette application qui permet de filmer l'ecran, puisque je souhaite filmer l'avancement de l'interface graphique lors d'une simulation.Bref, est ce qu'il est possible de nous en dire plus sur la capture d'ecran avec C++ builder. Merci
Citation Envoyé par sat83
Voilà un petit code pour effectuer une capture d'écran, et l'enregistrer dans un fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  keybd_event(VK_SNAPSHOT , 0, 0, 0);
  keybd_event(VK_SNAPSHOT , 0, KEYEVENTF_KEYUP, 0);
 
  Application->ProcessMessages();
 
  if ( Clipboard()->HasFormat( CF_BITMAP ) )
  {
     Graphics::TBitmap *img = new Graphics::TBitmap();
     img->Assign(Clipboard());
     img->SaveToFile( "D:\\CAPTURE_ECRAN.BMP" );
 
/* POUR SAUVEGARDER EN JPEG AU LIEU DE BMP
     TJPEGImage *jpg = new TJPEGImage() ;
     jpg->Assign( img ) ;
     jpg->SaveToFile( "D:\\CAPTURE_ECRAN.JPG" );
     delete jpg;
*/
     delete img ;
 
  }
  Clipboard()->Clear();
L'idée est donc de réaliser des captures d'écran à intervalle régulier, et de les enregistrer dans un répertoire (avec un nom de fichier incrémentiel pour avoir l'ordre de création). Le problème avec le format BMP, c'est qu'il est très lourd et donc ça prend beaucoup de place sur le disque dur.

Ensuite le but est de créer un fichier AVI à partir de cette suite d'image. De ce coté là je ne m'y connais pas trop, mais en cherchant sur le net ca dois se trouver...
Citation Envoyé par Argol_Medusa
Je pense qu'il serait préférable d'enregistrer dans la mémoire et d'ajouter les images en live dans l'avi.

Parce que en fait à 25 images par seconde, si on a du 1200 x 1024 ça va être énorme et je ne suis pas certain que le PC suive niveau puissance.

en mettant en mémoire, on gagne du temps et au pire si on dépasse la taille mémoire, c'est windows qui gère la mémoire tampo sur le disque dur après, mais si on encode directement en AVI, alors on peut détruire les images au fur et à mesure et donc plus besoin de tant de mémoire.

Perso je verrai bien 2 threads, l'une en capture en priorité haute et l'autre d'enregistrement AVI en priorité basse.
Citation Envoyé par Blako_17
ouai pour faire une série de screenshot ca doit vraiment galérer lol il faudrait que ce soit bien optimisé pour permetre de faire tourner une application lourde en parallel telqun jeu

sinon créer directement l'avi et y rajouté directement les screen, ca doit etre ± juste mais je vois pas du tout comment faire :S

en tout cas merci pour vos réponses et si je trouve qqch je vous dirai pour les autres qui sont interressés

a bientot
Citation Envoyé par sm1z2000
j'ai essayer de prendre plusieurs capture ecran à la suite mais lors de la sauvegarde je ne trouve que la 1ere??!
Pour la creation d'un avi comment on fait merci de m'eclaicrir le sujet.
a bientot.
Citation Envoyé par sat83
Citation Envoyé par sm1z2000
j'ai essayer de prendre plusieurs capture écran à la suite mais lors de la sauvegarde je ne trouve que la 1ere??!
Pour la creation d'un avi comment on fait merci de m'eclaicrir le sujet.
a bientot.
Est ce que tu a sauvegarder tes images avec un nom différent? Si tu les sauvegarde avec le même nom, c'est normal, à chaque fois la précédente est écrasée.
Citation Envoyé par Blako_17
J'ai fait un timer qui prend un screen ttes les 40milisec ce qui correspond théoriquement a 25images par secondes

le problème c'est que l'image prend un certain temps a se créer et finalement je narrive qu'a qq images par secondes et ca fait laguer le pc comme pas possible :S bon c aussi car je les ai mise en bmp alr je v essayer en jpg pr voir la différence




EDIT : en fait le probleme mnt est que je narrive pas a prendre suffisament de screen shot

>> quel est le format le plus léger ? Jentend par la, qui prendrait le moins de tps à être créé
>> et comment compiler une video avi depuis des images ?

ce sont mes 2 questions actuellement

merci ++
Citation Envoyé par Blako_17
j'ai tenter de capturer les screens en jpg mais ton code est foireux je n'y parviens pas malgré quelque correction de ton code :S si vous pouviez maider
merci
Citation Envoyé par sm1z2000
Citation Envoyé par sat83
Est ce que tu a sauvegarder tes images avec un nom différent? Si tu les sauvegarde avec le même nom, c'est normal, à chaque fois la précédente est écrasée.
Non j'ai rajouté un increment pour chaque capture donc ça devrait faire capture0, capture1,etc..
J'ai essayé avec plusieurs nom, logiquement ça devrait marcher
Citation Envoyé par sat83
Désolé de te contredire, mais le code que je t'ai donné n'est pas foireux, je l'ai tester et il fonctionne bien (sous C++ Builder 5 et 6)...

As tu bien importer les bon header?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
#include <Clipbrd.hpp>
#include <jpeg.hpp>
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondre
Citation Envoyé par sm1z2000
Citation Envoyé par Blako_17
J'ai fait un timer qui prend un screen ttes les 40milisec ce qui correspond théoriquement a 25images par secondes

le problème c'est que l'image prend un certain temps a se créer et finalement je narrive qu'a qq images par secondes et ca fait laguer le pc comme pas possible :S bon c aussi car je les ai mise en bmp alr je v essayer en jpg pr voir la différence




EDIT : en fait le probleme mnt est que je narrive pas a prendre suffisament de screen shot

>> quel est le format le plus léger ? Jentend par la, qui prendrait le moins de tps à être créé
>> et comment compiler une video avi depuis des images ?

ce sont mes 2 questions actuellement

merci ++
Je crois que le jpg est plus rapide car je crois prend moins de memoire,mais dis moi t'as fais comment pour le timer est ce que je peux voir ton code?
pour les reunir dans une video je vais utiliser un logiciel, mais faux deja que je prenne les capture...
Bonne journée
Citation Envoyé par sat83
Citation Envoyé par sm1z2000
Non j'ai rajouté un increment pour chaque capture donc ça devrait faire capture0, capture1,etc..
J'ai essayé avec plusieurs nom, logiquement ça devrait marcher
Poste un bout de ton code pour essayer de voir d'où peut venir le problème, ca ne dois pas être bien grave.
Citation Envoyé par Blako_17
Citation Envoyé par sat83
Désolé de te contredire, mais le code que je t'ai donné n'est pas foireux, je l'ai tester et il fonctionne bien (sous C++ Builder 5 et 6)...

As tu bien importer les bon header?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 #include <Clipbrd.hpp>
#include <jpeg.hpp>
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondre
désolé ce n'étais pas dans l'intention que tu le prenne mal, je me suis mal exprimé, je voulais simplement dire qu'en fait ca ne marchait pas
mais maintenant c'est bon merci

chez moi les screen passent de 7mo a 400ko lol

maintenant il faudrait pouvoir créer la video
Citation Envoyé par sm1z2000
Je crois que le jpg est plus rapide car je crois prend moins de memoire,mais dis moi t'as fais comment pour le timer est ce que je peux voir ton code?
pour les reunir dans une video je vais utiliser un logiciel, mais faux deja que je prenne les capture...
Bonne journée
Mon but est de créer directement la video et que l'utilisateur n'ait rien besoin de faire....

Pour le timer j'utilise le composant TTimer
Puis j'ai créé une fonction qui prend les screens
Et dans la fonction du timer j'appel cette en fonction en lui donnant le nouveau nom incrémenté en parametre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
    FileName = dir+"screen_"+AnsiString(ssnb)+".jpg";
    takescreen(0,0,resY,resX,FileName);
    ssnb++;
EDIT: par contre je reste a seulement 4 screen par seconde environ

voici mon code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 int rValue;
   HDC ScreenSrc;
 
   Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
   Bitmap->Height = hauteur;
   Bitmap->Width = largeur;
   ScreenSrc = GetWindowDC(HWND_DESKTOP);
   if (ScreenSrc == NULL) return;
   rValue = BitBlt(Bitmap->Canvas->Handle, 0, 0, largeur, hauteur, ScreenSrc, abscisse, ordonnee, SRCCOPY);
   if (rValue == 0) return;
  // Bitmap->SaveToFile(nomFichier);
   ReleaseDC(GetDesktopWindow(), ScreenSrc);
 
   
     TJPEGImage *jpg = new TJPEGImage() ;
     jpg->Assign( Bitmap ) ;
     jpg->SaveToFile( nomFichier );
     delete jpg;
     delete Bitmap;
 
     fraps++;
le problème c'est quil prend dabord en bmp puis sauve en jpg donc l'inconvénient du temps que prend le bmp a etre créé reste..

comment pourrait-on le faire directement en jpg sans passer par bmp ?

sat83 >> en fait ton code simule l'appui de la touche PrtSc (ImprEcran) mais si on veut en prendre plusieurs a la suite, il n'en prend qu'une par seconde environ meme moins et l'ordi est saturé, ca plante bien lol donc dsl mais c trop lent..
Citation Envoyé par sm1z2000
Citation Envoyé par sat83
Désolé de te contredire, mais le code que je t'ai donné n'est pas foireux, je l'ai tester et il fonctionne bien (sous C++ Builder 5 et 6)...

As tu bien importer les bon header?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 #include <Clipbrd.hpp>
#include <jpeg.hpp>
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondre
Oui ce code marche en rajoutant ces headers
Citation Envoyé par sm1z2000
Citation Envoyé par sat83
Poste un bout de ton code pour essayer de voir d'où peut venir le problème, ca ne dois pas être bien grave.
Voici ce que j'ai mis dans ma fct, c'est un truc vite fais puisque j'ai pas trop de temps pour m'y attarder, je vais reprendre demain matin...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int j=0;
do
{
 keybd_event(VK_SNAPSHOT , 0, 0, 0);
  keybd_event(VK_SNAPSHOT , 0, KEYEVENTF_KEYUP, 0);
 int i=0;
 
  Application->ProcessMessages();
 
  if ( Clipboard()->HasFormat( CF_BITMAP ) )
  {
     Graphics::TBitmap *img = new Graphics::TBitmap();
     img->Assign(Clipboard());
     //img->SaveToFile( "D:\\CAPTURE_ECRAN.BMP" );
 
/* POUR SAUVEGARDER EN JPEG AU LIEU DE BMP  */
     TJPEGImage *jpg = new TJPEGImage() ;
     jpg->Assign( img ) ;
     jpg->SaveToFile( "D:\\CAPTURE_ECRAN"+IntToStr(i)+".JPG" );
     
     i++;
     j++;
     delete jpg;
 
     delete img ;
 
  }
  Clipboard()->Clear();//L'idée est donc de réaliser des captures
}while(j != 10);
}
voila je voulais essayer avec 10 capture...
Citation Envoyé par Argol_Medusa
Citation Envoyé par sm1z2000
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
     Graphics::TBitmap *img = new Graphics::TBitmap();
(...)
/* POUR SAUVEGARDER EN JPEG AU LIEU DE BMP  */
     TJPEGImage *jpg = new TJPEGImage() ;
(..)
     delete jpg;
 
     delete img ;
C'est peut-etre un coup dans l'eau mais est-ce que l'on ne gagnerait pas de la vitesse en sortant la création et la destruction des objets images de la boucle do ?

Est-ce que la création destruction d'un objet TImage prend beaucoup de temps ?
Je dis ça parce que même si c'est q'une milliseconde, on a 2 images donc 2 ms, à 25 images par secondes ça fait 50ms de gagner donc de quoi faire une capture d'image en plus.


Sinon une autre idée comme ça, à voir ce qu'elle vaut, mais on ne doit pas être synchronisé avec ce système, il faudrait donc peut-etre mettre un Timer1 en 1000/25 = 40 ms, timer qui contiendrait ce code.
L'avantage aussi c'est qu'on garderait la main sur le programme lors de la capture.