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

C++ Discussion :

Imposer codec XVID avec Directshow


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Avril 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 1
    Par défaut Imposer codec XVID avec Directshow
    Hello,

    J'ai écrit un player de video pour decoder des vidéos compessées en XVID, puis recopier les frames dans une texture DirectX9.

    Donc mon code, j'appelle la fonction AddSourcefilter() qui choisi le codec adapté à ma vidéo.
    Problème: suivant la machine il existe de nombreux codecs XVID/DIVX/MPEG-4 qui sont plus ou moins compatibles et qui créent des bugs sur certaines configs.
    Donc, je voudrais simplement imposer le choix de mon codec XVID dans mon graphe Directshow.

    Voici mon code pour mon graphes:

    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
    HRESULT initStreams(SMoviePlayer *mp,int volume) 
    {
        HRESULT hr = S_OK;
        IBaseFilter		*pFTR;           // Texture Renderer Filter
        IBaseFilter		*pFSrc;          // Source Filter
        IPin			*pFSrcPinOut;    // Source Filter Output Pin   
        IPin	        *pFTRPinIn;      // Texture Renderer Input Pin
     
        // Create the filter graph
    	hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID*)&g_pGB);
        //if (FAILED(g_pGB.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC)))
        //    return E_FAIL;
     
    	// Create the Texture Renderer object
        mp->pCTR = new CTextureRenderer(NULL, &hr);
        if (FAILED(hr) || !mp->pCTR)
        {
            werrorv("Could not create texture renderer object!  hr=", hr);
            return E_FAIL;
        }
     
        // Get a pointer to the IBaseFilter on the TextureRenderer, add it to graph
        pFTR = mp->pCTR;
        if (FAILED(hr = g_pGB->AddFilter(pFTR, L"TEXTURERENDERER")))
        {
            werrorv("Could not add renderer filter to graph!  hr=", hr);
            return hr;
        }
     
        WCHAR wFileName[MAX_PATH];
    	MultiByteToWideChar(CP_ACP, NULL,mp->cVideoFile, MAX_PATH, wFileName, MAX_PATH);
     
    	// Add the source filter to the graph.
        hr = g_pGB->AddSourceFilter (wFileName, L"SOURCE", &pFSrc);
        if(FAILED(hr))
        {
            werrorv("Could not add source filter to graph!  hr=", hr);
            return hr;
        }
    En fait ce qu'il faudrait c'est remplacer g_pGB->AddSourceFilter (wFileName, L"SOURCE", &pFSrc); avec une fonction du type AddFilter() à laquelle je fournis le CLSID précis de mon codec XVID, et ainsi eviter que d'autres codecs indérisables soient séléctionnés à sa place.

    Quelqu'un aurait-il déjà codé cela, ou bien des conseils?
    Merci.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Normalement il 'suffit' d'inserer le filtre du codec xvid... et laisser le graph-manager se demerder pour connecter les pins...

    Sinon, autre solution:
    - Inserer le filtre source (A)
    - Inserer le filtre codec (B)
    - Connecter le pin de sortie de A au pin d'entrée de B (laisser le graphe se dépatouiller avec les filtres intermédiaires)
    - Et demander un render sur le(s) pin(s) de sortie de B

Discussions similaires

  1. repetition de sons avec Directshow
    Par kouax dans le forum DirectX
    Réponses: 2
    Dernier message: 21/05/2006, 13h50
  2. Juxtaposition/Synchro de 2 videos avec DirectShow
    Par kioeev dans le forum DirectX
    Réponses: 18
    Dernier message: 21/04/2005, 20h23
  3. pbleme d'affraichissement d'image avec directshow
    Par lykim dans le forum DirectX
    Réponses: 4
    Dernier message: 17/03/2005, 09h08
  4. problème de capture son avec Directshow
    Par albator83 dans le forum DirectX
    Réponses: 2
    Dernier message: 06/11/2003, 17h18
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

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