IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

cr�ation d'un AVI (partie choses s�rieuses)


Sujet :

MFC

  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut cr�ation d'un AVI (partie choses s�rieuses)
    Bonjour,

    J'ai un code pour l'instant que je posterai quand j'aurai des questions sp�cifiques dessus � poser, mais l�, comme l'indique le titre, il s'agit d'un gros probl�me avant m�me de tester quoi que ce soit :

    La fameuse error LNK2019 que personne apparemment ne pige tellement (� ce que je vois sur les forums):

    j'ai Visual C++.Net et j'ai ajout� dans les link de ma classe le :
    #include <Vfw.h> //pour les cr�ation d'AVI

    Ci-dessous un extrait des erreurs (pas la peine de toutes les mettre, c'est du m�me style : j'en ai mis 2 sur les 8).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    SaveSequenceDlg.obj : error LNK2019: symbole externe non résolu _AVIStreamWrite@32 référencé dans la fonction "public: void __thiscall CSaveSequenceDlg::OnSavesequence(void)" (?OnSavesequence@CSaveSequenceDlg@@QAEXXZ)
    SaveSequenceDlg.obj : error LNK2019: symbole externe non résolu _AVIStreamRelease@4 référencé dans la fonction "public: void __thiscall CSaveSequenceDlg::OnSavesequence(void)" (?OnSavesequence@CSaveSequenceDlg@@QAEXXZ)

  2. #2
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    http://msdn.microsoft.com/library/en-us/multimed/htm/_win32_avistreamwrite.asp
    Header: Declared in Vfw.h.
    Library: Use Vfw32.lib.
    tu lies avec Vfw32.lib ?

  3. #3
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    J'avais �t� voir sur la msdn et donc

    Header: Declared in Vfw.h.

    ----> j'�cris #include <Vfw.h>

    Library: Use Vfw32.lib.

    --->Outils/Options/Projet/R�pertoires de VC++ j'ajoute dans "Fichiers Biblioth�que" : C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib (cette Vfw32.lib se trouve dedans)


    Mais �a ne suffit pas apparemment (j'ai �videmment r�g�n�r�, m�me red�marr� Visual....)

  4. #4
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    non, tu dois linker explicitement avec le fichier !

  5. #5
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Ce commentaire ne m'est pas d'une tr�s grande aide

    En attendant quelque chose d'un peu plus sp�cifique (je ne comprend pas alors qu'est-ce que c'est que "linker" si c'est pas �crire des include).

    Pour "passer le temps" (hum), j'ai tent� le #include <Vfw32.h> mais c'est n'importe quoi.

    EDIT : j'ai m�me �t� dans Projet/Propri�t�s/Editeur de Lines/G�n�ral/R�pertoires de Biblioth�que suppl�mentaires o� j'ai rajout� encore une fois le dossier qui contient cette lib, mais queue dalle!!!

  6. #6
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    #pragma comment( lib, "Vfw32.lib" )

  7. #7
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Citation Envoy� par nico-pyright(c)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    #pragma comment( lib, "Vfw32.lib" )

    Ce commentaire l� m'est beaucoup plus utile.
    Bravo chef!

  8. #8
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Voil� le code maintenant :
    j'arrive bien au bout sans erreur...mais le fichier AVI cr�� fait 0ko

    D'o� vient le probl�me?
    Mes images sont � l'endroit indiqu� par pSequence les unes � la suite des autres de taille width x height x 3 bytes
    La s�quence est de taille sizeofsequence.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    /*creation of bitmap pictures*/
    	BITMAPINFOHEADER Bih;
    	ZeroMemory(&Bih, sizeof(BITMAPINFOHEADER));/*restoring*/
    	Bih.biBitCount = 24; /*3 x 8 bits per pixel*/
    	Bih.biCompression = BI_RGB;
    	Bih.biHeight = height;
    	Bih.biWidth = width;
    	Bih.biPlanes = 1;
    	Bih.biSize = sizeof(Bih);
     
    	PAVIFILE newavi;
    	int r;
     
    	/*openning and test of the avi file*/
    	r=AVIFileOpen(&newavi, "test.avi",OF_WRITE | OF_CREATE, NULL);
    	if(r!=0)
    	{
    		if(newavi!=NULL)
    			AVIFileRelease(newavi);
    		puts("error in openning avi file");
    		return ;
    	}
     
     
    	/*copy of the information*/
    	AVISTREAMINFO streaminfo;
    	ZeroMemory(&streaminfo, sizeof(AVISTREAMINFO));/*restoring*/
     
    	streaminfo.fccType = streamtypeVIDEO;
    	streaminfo.fccHandler =0;
    	streaminfo.dwScale = 1;
    	streaminfo.dwRate = 30; // à voir combien je vais mettre, le vrai framerate d'acquisition sans doute
    	streaminfo.dwSuggestedBufferSize =0;
    	streaminfo.dwQuality =1000;
    	streaminfo.rcFrame.right =width; 
    	streaminfo.rcFrame.bottom =height; 
     
    	/*creation of the new stream*/
    	PAVISTREAM avistream;
    	r=AVIFileCreateStream(newavi,&avistream, &streaminfo);
    	if (r!=0)
    	{
    		puts("error in the creation of the new stream");
    		AVIFileRelease (newavi);
    		AVIFileExit ();
    		return ;
    	}
     
     
    	/*format of the stream*/
    	AVIStreamSetFormat(avistream, 0, &Bih, sizeof(Bih));
    	if (r!=0)
    	{
    		puts("error in the setting of the stream format");
    		AVIStreamClose(avistream);
    		AVIFileRelease (newavi);
    		AVIFileExit ();
    		return ;
    	}
     
     
    	/*stream writing */
    	r = AVIStreamWrite(avistream, 0, nb_images, pSequence, sizeofsequence, AVIIF_KEYFRAME, NULL, NULL);
    	if(r==0)
    		AfxMessageBox("OK!");
     
    	AVIFileRelease (newavi);

  9. #9
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    ...ou alors je finis par avoir mon AVI de 12 images (640x480 je crois) pour 10797 ko (je crois qu'il faut que je quitte Visual pour �a, � v�rifier), mais en tous cas quand je lance la lecture avec Windows Media, j'ai le message :


    Impossible de lire le fichier. Le format n'est pas pris en charge.

    Bien-s�r, j'ai d�j� pu lire des AVI sur mon ordi, c'est juste celui que je fabrique qui ne va pas.

  10. #10
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    Citation Envoy� par stof
    Ce commentaire ne m'est pas d'une tr�s grande aide

    En attendant quelque chose d'un peu plus sp�cifique (je ne comprend pas alors qu'est-ce que c'est que "linker" si c'est pas �crire des include).

    Pour "passer le temps" (hum), j'ai tent� le #include <Vfw32.h> mais c'est n'importe quoi.

    EDIT : j'ai m�me �t� dans Projet/Propri�t�s/Editeur de Lines/G�n�ral/R�pertoires de Biblioth�que suppl�mentaires o� j'ai rajout� encore une fois le dossier qui contient cette lib, mais queue dalle!!!
    Propri�t�s du projet �dition des liens entr�es et l�, premi�re ligne !
    Il y a l'aide de Visual pour ce genre de choses !
    Et pour la raison du fichier vide, il te faudrait d�bugger d'abord ton code.

  11. #11
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Aide toi de �a:
    http://www.shrinkwrapvb.com/avihelp/avihelp.htm

  12. #12
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    Personellement, j'ai ajout� la cr�ation de films � mon appli la semaine derniere, et j'ai opt� pour des classes d'aides qui encapsulent la manipulation des streams AVI:

    http://www.codeproject.com/audio/avigenerator.asp
    http://www.codeproject.com/bitmap/cr...&select=709023

    (le dernier lien donne aussi le code pour g�n�rer du wmv et du mov)

    Finalement j'ai opt� pour la derni�re, plus simple, et sans selection du codec (tu peux le changer dans le code, c'est pile ce qu'il me fallait)

    Ca facilite pas mal la t�che, et en regardant le code (ou en changeant des parties, etc ...) tu peux bien comprendre comment �a fonctionne... donc c'est plut�t pas mal au final ! (avis perso )

    Voil����

    bigquick

  13. #13
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Mercis � tous les 2 pour les liens :

    http://www.shrinkwrapvb.com/avihelp/avihelp.htm c'est du Visual Basic et en plus au mieux cr�ation d'AVI � partir de bmp (donc pas trop ce que je fais)

    http://www.codeproject.com/audio/avigenerator.asp c'est pour de l'OpenGL

    http://www.codeproject.com/bitmap/createmovie.asp?df=100 : c'est effectivement le plus proche de ce qu'il me faut. Mais je n'ai pas tr�s bien compris pourquoi on a aussi peu de contr�le (framerate, m�me avec l'explication).

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    J'aimerais bien en fait que le code que j'ai �crit (cf ci-dessus) puisse fonctionner car �a ne doit pas �tre loin du compte :
    mon seul probl�me est qu'au final le "format n'est pas pris en compte" (en exceptant le fait qu'il faille fermer mon application pour le voir appara�tre compl�tement) donc un truc a du �tre mal fait un moment dans le code mais :

    1�/ j'ai mon AVI
    2�/Sa taille est presque bonne (je calcule 10 images de 640x480 en 3 bytes/pixel : 640*480*3*10/1024 = 9000 ko et en fait le fichier AVI que j'obtiens fait 8956 ko) : par cons�quent, �a doit presque faire ce que je demande.

  14. #14
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    Pour ton message d'erreur, il me semble qu'au omindre petit d�faut de taille du fichier, ou � la moindre erreur dans l'en t�te, WMP t'affichera un message du type "format non reconnu"

    Sinon, par rapport au dernier lien, ils expliquent (si je me souviens bien) qu'ils n'ont rien fait pour setter le framerate, parcequ'une methode setFrameRate n'a pas beaucoup de sens .... celui-ci doit etre d�fini avant m�me d'�crire le header, donc c'est pas vraiment une m�thode appelable n'importe quand qu'il nous faut ...

    Le mieux serait un parametre du constructeur, mais comme ce n'�tait pas le but de l'article, le framerate est en dur dans le code (� deux endroits diff�rents je crois, beurk ). Donc � toi de remplacer �a par une variable de classe, et d'en faire un parametre du constructeur. Idem pour la qualit� de la compression par exemple ...

    Sinon est-ce que tu peux d�tailler plus la partie AVIStreamWrite ?
    Il vient d'ou ce pSequence ? Que contient-il exactement ?

  15. #15
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Citation Envoy� par bigquick
    Sinon est-ce que tu peux d�tailler plus la partie AVIStreamWrite ?
    Il vient d'ou ce pSequence ? Que contient-il exactement ?
    OK, j'ai compris alors l'histoire du framerate; c'est pour �a qu'en fait �a serait bien que je ma�trise bien la cr�ation pour mettre ce que je veux dans mon header (dans le code que j'ai post�, je vois o� on le fixe le framerate).
    Mais bon, �a c'est du d�tail.

    Mon pS�quence : il a �t� acquis en un gros bloc par ma cam�ra (il est v�rifi�, puisque je sais d�j� le d�couper pour r�cup�rer chaque image et ensuite les sauvegarder sur le disque dur).

    STDAPI AVIStreamWrite(
    PAVISTREAM pavi,
    LONG lStart,
    LONG lSamples,
    LPVOID lpBuffer,
    LONG cbBuffer,
    DWORD dwFlags,
    LONG * plSampWritten,
    LONG * plBytesWritten
    );


    --->
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    AVIStreamWrite(avistream, 0, nb_images, pSequence, sizeofsequence, AVIIF_KEYFRAME, NULL, NULL);
    pr�cision : alors que je dis sizeofsequence = 9216000 octets , le fichier final fait 9170432 octets.
    Le "0" pour "lStart" ne change rien si je met un autre chiffre (5 par exemple).

    Une autre pise aussi, c'est ici :
    le code de cr�ation est � partir d'images BMP (s'il le faut, j'irai les chercher puisque je sais d�j� sauver mes images en bmp, c'est une autre solution mais on doit pouvoir le faire � partir de mon bloc d'images pSequence) :
    http://www.wischik.com/lu/programmer/avi_utils.html#examples

    2 probl�mes :
    d:\avi_utils.h(9) : error C2143: erreur de syntaxe : absence de ',' avant '*'
    --> c'est la ligne HAVI CreateAvi(const char *fn, int frameperiod, const WAVEFORMATEX *wfx);
    d:\avi_utils.h(31) : error C2061: erreur de syntaxe : identificateur 'AVICOMPRESSOPTIONS'
    --> c'est la ligne HRESULT SetAviVideoCompression(HAVI avi, HBITMAP hbm, AVICOMPRESSOPTIONS *opts, bool ShowDialog, HWND hparent);

  16. #16
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    :

  17. #17
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Ben j'ai pas trop de succ�s moi avec mon AVI...faut dire que seules des personnes qui l'ont d�j� fait peuvent m'aider, �a doit pas sauter aux yeux au premier abord.

    Je pense qu'une fois corrig�, il pourrait �tre utile � vachement de personnes parce qu'il n'existe que peu de choses simples sur la question.

  18. #18
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    759
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 759
    Par d�faut
    Je remonte une fois, sinon j'y reviendrai un autre jour avec une r��criture simple du probl�me ; en attendant, bref r�sum� : il y a mon code en premi�re page, et le probl�me c'est que mon AVI fait PRESQUE la bonne taille (il en manque un peu, cf premi�re page) mais surtout, il n'EST PAS LISIBLE (un truc a du m'�chapper dans la cr�ation de cet AVI).
    Et puis, moins grave pour l'instant, pour voir appara�tre sa taille, il faut fermer l'application (sinon, il est indiqu� 0 ko).

    Voil�.

  19. #19
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    C'est � la fermeture de ton programme qu'il lib�re l'AVI ?
    Sinon, fais F5 et tu verras la taille pendant que l'application fonctionner.

  20. #20
    Membre extr�mement actif

    Homme Profil pro
    Ing�nieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par d�faut
    Bonjour,

    je fais remonter le post puisque en ce moment c'est ce que je recherche � faire.

    Je bloque � un premier niveau.

    Compilateur : devc++ 5.0 version beta.
    Voici le code ( il est necessaire d'ajouter la librairie libvfw32.a au linkage):

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <Vfw.h>
     
    int main(int argc, char *argv[])
    {
      //déclaration
      int ErreurCode;
      PAVIFILE AviFile=NULL;
     
      //début du programme
     
      ErreurCode =AVIFileOpen ( &AviFile,"test.avi",OF_CREATE,NULL);
     
      if ( !ErreurCode) {
           //mettre ici le code
       }else {
             printf("Erreur fonction AviFileOpen %d %x",ErreurCode,AviFile);      
       }
     
     
      system("PAUSE");	
      return 0;
    }
    Donc AviFileOpen �choue. Elle me renvoi -2147221008 qui ne correspond � aucune erreur connue ( AVIERR_BADFORMAT,...) Voir ici

    Je suis pas parti plus loin puisque a priori il est indispensable de poss�de un handle sur ce fichier.

    Merci d'avance

Discussions similaires

  1. cr�ation de formulaire avec partie dynamique
    Par altair8080 dans le forum Biblioth�ques et frameworks
    R�ponses: 0
    Dernier message: 08/06/2010, 13h40
  2. Cr�ation entete en deux parties
    Par danfa dans le forum Mise en page CSS
    R�ponses: 2
    Dernier message: 12/11/2009, 20h43
  3. [MSSQL05] Cr�ation d'une table � partie d'une vue
    Par tamiii dans le forum MS SQL Server
    R�ponses: 2
    Dernier message: 01/07/2008, 10h45
  4. Cr�ation d'un AVI avec l'API VfW
    Par dvillet dans le forum MFC
    R�ponses: 4
    Dernier message: 30/03/2006, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo