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

Windows Discussion :

AVIStreamOpenFromFile n'ouvre pas les vidéos compressées ?


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 430
    Points : 93
    Points
    93
    Par défaut AVIStreamOpenFromFile n'ouvre pas les vidéos compressées ?
    Bonjour, j'essaye de lire une vidéo avec AVIStreamOpenFromFile, cela fonctionne bien avec des videos non compressée mais dès que j'essaye avec du divx ou xvid par exemple, la fonction AVIStreamOpenFromFile retourne une erreur, j'ai essaye en mettant autre chose que streamtypeVIDEO mais ca ne change rien, est qu'il faut initialiser quelques chose avant ou charger un codec ou est-ce impossible avec cette fonction ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut,
    tu peux compresser en entrée avec AVIMakeCompressedStream. Par contre pour lire il n'existe apparemment pas de fonction pour décompresser une vidéo avec des codecs ( regarder dans le MSDN )
    Le mieux serait d'utiliser directement DirectShow, ce serait vraiment plus souple si c'est pour lire simplement une vidéo.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 430
    Points : 93
    Points
    93
    Par défaut
    Oui apparemment c'est juste pour créer une vidéo, c'est bête...
    Le but c'est de mettre une vidéo sur une texture dans un programme directx, j'ai réussit avec une vidéo non compressée. Je sais que directcshow peut le faire, d'ailleur il y a un exemple dans le SDK mais je le trouve très compliqué juste pour faire ça, à comparé de VFW à moins que ce soit l'exemple du SDK qui est mal foutu...

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut SuperGrey oui DirectShow est plus complexe et lourd.
    Mais sinon je ne vois pas trop autrement.
    As-tu une autre solution ?
    Sinon peut-être en passant par les commandes MCI...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 430
    Points : 93
    Points
    93
    Par défaut
    D'après un invité de passage qui m'a laissé un message privé c'est possible:

    oui, il faut initialiser (c'est une FAQ de longue date sur le réseau pro (news://nntp.aioe.org/fr.comp.os.ms-w....programmation)
    Mais je ne trouve pas, j'ai beau cherché sur google, personne ne semble s'intéresser à ça, c'est quand même bizarre. Personne ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 430
    Points : 93
    Points
    93
    Par défaut
    Youpie, J'ai trouvé !
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    	AVISTREAMINFO		psi;						// Pointer To A Structure Containing Stream Info
    	PAVISTREAM			pavi;						// Handle To An Open Stream
    
    	HIC                 hic;
    	LPBITMAPINFOHEADER	m_outformat;// Contains decompressor output format 
    	LPBITMAPINFOHEADER	m_informat; // Contains decompressor input format
    	unsigned char *		m_avidatac;
    
    
    	long				lastframe;					// Last Frame Of The Stream
    	int					width;						// Video Width
    	int					height;						// Video Height
    	int					mpf;						// Will Hold Rough Milliseconds Per Frame
    
    
    
    
    	AVIFileInit();							// Opens The AVIFile Library
    
    
    
    	// Opens The AVI Stream
    	if (AVIStreamOpenFromFile(&pavi, "test.avi", streamtypeVIDEO, 0, OF_READ, NULL) !=0)
    	{
    		// An Error Occurred Opening The Stream
    		MessageBox (HWND_DESKTOP, "Failed To Open The AVI Stream", "Error", MB_OK | MB_ICONEXCLAMATION);
    	}
    
    	AVIStreamInfo(pavi, &psi, sizeof(psi));				// Reads Information About The Stream Into psi
    	width=psi.rcFrame.right-psi.rcFrame.left;			// Width Is Right Side Of Frame Minus Left
    	height=psi.rcFrame.bottom-psi.rcFrame.top;			// Height Is Bottom Of Frame Minus Top
    
    	lastframe=AVIStreamLength(pavi);				// The Last Frame Of The Stream
    
    	mpf=AVIStreamSampleToTime(pavi,lastframe)/lastframe;		// Calculate Rough Milliseconds Per Frame
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    	 LONG          size;
    
    
    
        if (AVIStreamFormatSize(pavi, 0, &size)) {
            //printf("[GLAvi::Init] AVIStreamFormatSize returned an error code\n");
            return ;
        }
    
        // Setup our format structs
        m_informat  = (LPBITMAPINFOHEADER)new unsigned char[size];
        m_outformat = (LPBITMAPINFOHEADER)new unsigned char[size];
        if (!m_informat || !m_outformat) {
            //printf("[GLAvi::Init] ERROR MEMALLOC m_format\n");
            return ;
        }
        memset(m_outformat, 0, size);
        memset(m_informat, 0, size);
    
        // Read in our input format
        if (AVIStreamReadFormat(pavi, 0, m_informat, &size)) {
            //printf("[GLAvi::Init] AVIStreamReadFormat returned and error code\n");
            return ;
        }
        
        // Since we dont want 2048x2048 textures we fail on large inputs
        if (m_informat->biWidth > 1024) {
            //printf("[GLAvi::Init] Input size to large\n");
            return ;
        }
    
        // Setup our output format
        m_outformat->biSize         = size;                     // Sizof self (BITMAPINFOHEADER)
        m_outformat->biWidth        = m_informat->biWidth;      // Set output size to input size for now
        m_outformat->biHeight        = m_informat->biHeight;     // Set output size to input size for now
        m_outformat->biPlanes       = 1;                        // RGB 1 plane
        m_outformat->biBitCount     = 32;                //4 bytes par pixel pour la trexture directx
    
    
    
     // Now use ICLocate to find an appropriate decompressor
        hic = ICLocate(ICTYPE_VIDEO, psi.fccHandler, m_informat, m_outformat, ICMODE_DECOMPRESS);    
        if (!hic) {
            //printf("[GLAvi::Init] ICLocate did not return a decompressor\n");
            return ;
        }
    
        // Determine if decompressor will work on AVI stream
        if (ICDecompressQuery(hic, m_informat, m_outformat) != ICERR_OK) {
            //printf("[GLAvi::Init] ICDecompressQuery failed cannot decompress format\n");
            return ;
        }
        
        // Start our decompressor
        if (ICDecompressBegin(hic, m_informat, m_outformat) != ICERR_OK) {
            //printf("[GLAvi::Init] ICDecompressBegin failed");        
            return ;
        }
    
    
    
    	m_avidatac   = new unsigned char[512 * 512 * 3];
    Pour l'initialisation et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	if (AVIStreamRead(pavi, frame, 1, m_avidatac, npix * 3, NULL, NULL)) {
                //printf("[GLAvi::GetNextFrame] AVIStreamRead returned an error");
                return ;
        }
    
    
    
        // Decompress frame into our texture buffer
        if (ICDecompress(hic, 0, m_informat, m_avidatac, m_outformat, desttex) != ICERR_OK) {
            //printf("[GLAvi::GetNextFrame] ICDecompress returned an error");
            return ;
        }

    Et ca marche avec du divx (d'abord cru que ca marchait pas en utilisant une video XVID mais divx ca marche).
    Bon comme y'a du code made in moi c'est très brouillon mais l'essentiel est la !


    Pour un code plus propre voir la source: http://www.gamedev.net/community/for...opic_id=384367

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 430
    Points : 93
    Points
    93
    Par défaut
    Par contre j'ai une violation d'acces sur un HeapFree quand mon programme quitte, à priori à cause de ce code, mon nettoyage étant le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    delete m_avidatac;
    delete [] m_informat;
    delete [] m_outformat;
    
    AVIStreamRelease(pavi);						// Release The Stream
    ICDecompressEnd(hic);
    
    AVIFileExit();							// Release The File
    Y'aurait il un oubli ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 430
    Points : 93
    Points
    93
    Par défaut
    Je me répond: OUI, il manquait ICClose(hic);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] VB.NET n'ouvre pas les PDFs avec adobe reader 11
    Par stc074 dans le forum VB.NET
    Réponses: 9
    Dernier message: 08/02/2013, 04h10
  2. Adobe reader 11 n'ouvre pas les PDFs
    Par stc074 dans le forum Windows 8
    Réponses: 2
    Dernier message: 07/02/2013, 10h03
  3. [Débutant] un webbrowser qui n'ouvre pas les fichiers pdf
    Par rinuom99 dans le forum C#
    Réponses: 4
    Dernier message: 02/11/2011, 08h28
  4. [AJAX] AJAX n'ouvre pas les popups ?
    Par hatembr dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/04/2007, 21h11
  5. internet explorer ne m'ouvre pas les pages pdf
    Par ghita269 dans le forum IE
    Réponses: 2
    Dernier message: 24/11/2005, 23h55

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