Posts ajouté avant le Rollback
Citation:
Envoyé par Blako_17bonjour,
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 sat83Tu peux t'en sortir en faisant des captures d'écran à intervalle régulier.
Citation:
Envoyé par sm1z2000bjr,
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 sat83Voilà un petit code pour effectuer une capture d'écran, et l'enregistrer dans un fichier:
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.Code:
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();
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_MedusaJe 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_17ouai 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 sm1z2000j'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 sat83Est 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 sm1z2000j'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.
Citation:
Envoyé par Blako_17J'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_17j'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 sm1z2000Non j'ai rajouté un increment pour chaque capture donc ça devrait faire capture0, capture1,etc..Citation:
Envoyé par sat83Est 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.
J'ai essayé avec plusieurs nom, logiquement ça devrait marcher:cry:
Citation:
Envoyé par sat83Dé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?
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondreCode:
1
2 #include <Clipbrd.hpp> #include <jpeg.hpp>
Citation:
Envoyé par sm1z2000Je 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?Citation:
Envoyé par Blako_17J'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 ++
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 sat83Poste 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 sm1z2000Non 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:cry:
Citation:
Envoyé par Blako_17dé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 pasCitation:
Envoyé par sat83Dé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?
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondreCode:
1
2 #include <Clipbrd.hpp> #include <jpeg.hpp>
mais maintenant c'est bon merci
chez moi les screen passent de 7mo a 400ko lol 8-)
maintenant il faudrait pouvoir créer la videoMon but est de créer directement la video et que l'utilisateur n'ait rien besoin de faire....Citation:
Envoyé par sm1z2000Je 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
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 :
EDIT: par contre je reste a seulement 4 screen par seconde environCode:
1
2
3 FileName = dir+"screen_"+AnsiString(ssnb)+".jpg"; takescreen(0,0,resY,resX,FileName); ssnb++;
voici mon code
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..Code:
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++;
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 sm1z2000Oui ce code marche en rajoutant ces headersCitation:
Envoyé par sat83Dé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?
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondreCode:
1
2 #include <Clipbrd.hpp> #include <jpeg.hpp>
Citation:
Envoyé par sm1z2000Voici 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...Citation:
Envoyé par sat83Poste un bout de ton code pour essayer de voir d'où peut venir le problème, ca ne dois pas être bien grave.
voila je voulais essayer avec 10 capture...Code:
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); }
Citation:
Envoyé par Argol_MedusaC'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 ?Citation:
Envoyé par sm1z2000Code:
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 ;
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.