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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut Même probleme
    Salut,

    j'ai exactement le même problème mis à part quelques détail:

    Lorsque j'exécute mon application sous XP aucun problème ( taille et relecture du fichier), par contre lorsque j'exécute la même application sous Vista, la taille du fichier est 0 Ko et donc impossible de lire le fichier.

    Serait-ce un problème de codec ? de lib ?
    L'ordinateur sous Vista est neuf il n'y a presque rien d'installé dessus...
    Par contre je peux lire les fichiers vidéos enregistrés par mon application sous XP !

    J'ai essayé l'enregistrement de vidéo avec OpenCV:
    exactement les même résultats: L'application fonctionne sous XP et enregistre,
    Les vidéos sont lisibles par l'ordinateur sous vista.
    Mais il reste impossible d'enregistrer la moindre vidéo.

    Petit détail: j'utilise Visual Studio 2003 (lol)!
    il est donc impossible de compiler sous Vista avec ...

    En espérant que quelqu'un ai une piste, je continue mes recherche et vous tiens informé en cas de découverte.

    Cordialement,
    Sébastien.

  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
    :

  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
    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.

  19. #19
    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à.

  20. #20
    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.

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