Posts ajouté avant le Rollback
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 bientoEnvoyé par sat83
Tu peux t'en sortir en faisant des captures d'écran à intervalle régulier.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. MerciEnvoyé par sat83
Voilà 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 : 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();
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...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.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 bientotEnvoyé 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.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.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.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 ++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
merciEnvoyé par sm1z2000
Non j'ai rajouté un increment pour chaque capture donc ça devrait faire capture0, capture1,etc..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.
J'ai essayé avec plusieurs nom, logiquement ça devrait marcherEnvoyé 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?
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <Clipbrd.hpp> #include <jpeg.hpp>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?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 ++
pour les reunir dans une video je vais utiliser un logiciel, mais faux deja que je prenne les capture...
Bonne journéeEnvoyé 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.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 marcherEnvoyé par Blako_17
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 pasEnvoyé 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?
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <Clipbrd.hpp> #include <jpeg.hpp>
mais maintenant c'est bon merci
chez moi les screen passent de 7mo a 400ko lol
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....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
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 environ
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++;
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 : 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++;
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..Envoyé par sm1z2000
Oui ce code marche en rajoutant ces headersEnvoyé 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?
PS: un conseil, évite les remarques de ce genre, parce que sur un plan personnel ça me donne plus envie de te répondre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <Clipbrd.hpp> #include <jpeg.hpp>Envoyé par sm1z2000
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...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.voila je voulais essayer avec 10 capture...
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); }Envoyé par Argol_Medusa
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 ?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 ;
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.
Partager