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

 Delphi Discussion :

Problème avec SampleGrabber sous Win7 qui nécessite ColorConverterDMO


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Problème avec SampleGrabber sous Win7 qui nécessite ColorConverterDMO
    Bonjour,
    Pour mon projet qui permet le rendu d'un flux audio+vidéo de type Mpeg2 encapsulé en .TS, je dois si possible éviter d'utiliser DSpack.
    Je fabrique donc le graphe Directshow à la main
    ma méthode est de mettre le début du graph jusqu'au démultiplexer Mpeg2, de lui ajouter le VMR9 renderer et demander un rendu automatique des pins audio et vidéo
    ( je suis obligé car sous XP je ne sais pas d'avance les codecs disponibles sur les PC des futurs utilisateurs.)
    Pas de problème sous XP
    Pas de problème sous Win7
    tout marche très bien. ( voir photo du graphe sans grabber)

    2ème étape:
    j'ai besoin de faire des captures de l'écran vidéo.
    avec la fonction de capture du VMR9 pas de problème mais un inconvénient: obligé de faire une rapide pause le temps du grab et cela ne fait pas un bel effet quand il y a des capture régulières.
    Donc seule méthode : rajouter un filtre SampleGrabber dispo sur toutes les versions de Windows.
    Pas de problème avec XP, avec un codec comme celui de Cyberlink PDVD12, le sampleGrabber se relie très bien.
    Mais avec Win7, impossible de relier directement le SampleGrabber au Microsoft DTV/DVD video Decoder, il faut mettre entre les 2 un Color Converter DMO.
    et c'est là que je coince, ma petite tête ne trouve où est mon problème:
    le graphe se construit à la perfection, mais je n'ai pas de rendu vidéo (fenêtre noire) - ni de message d'erreur
    ça marche sous XP avec le sampleGrabber.
    ça ne marche pas sous win7 avec le colorConverterDMO suivi du SampleGrabber.
    Je suis quasi sûr que mon problème viens de ce filtre DMO (c'est la première fois que je manipule ce genre de bête) que je n'ai pas réglé comme il faut???
    voici la photo du graphe obtenu sous Win7.
    les PIDs audio et video sont pourtant trouvés mais pas de rendu vidéo, la fenêtre reste noire. ( de même avec VMR7)

    ( le même graphe fabriqué avec GrapEdit fonctionne lui parfaitement!, c'est celui que je fait à la main qui ne fonctionne pas)

    Je vous joins les passages de mon source:
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
        ErrorMessage := '';
        Result := False;
        DirectShowGraph := TDirectShowGraph.Create(Owner);
        try
       // Création du Graph
          Hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, DirectShowGraph.FGraphBuilder);
          if Failed(Hr) then
          begin
            ErrorMessage := 'Filter graph creation error.';
            Exit;
          end;
     
          // Add to ROT si demandé
          if AllowAddToRot then
          begin
            Hr := AddToRot(DirectShowGraph.FGraphBuilder, DirectShowGraph.FRotEntry);
            if Failed(Hr) then
            begin
              DirectShowGraph.FRotEntry := -1;
              ErrorMessage := 'Filter graph could not be added to the ROT.';
              Exit;
            end;
          end;
     
    	  //..... Importation des différents filtres dans le graphe
     
    	    //*****************************************
    	    // Rajout du Video Mixing Renderer9
    		 //*****************************************
            Hr := CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, VideoMixingRendererFilter);
            if Failed(Hr) then
            begin
              ErrorMessage := 'Could not use the Video Mixing Renderer.';
              Exit;
            end;
            Hr := DirectShowGraph.FGraphBuilder.AddFilter(VideoMixingRendererFilter, 'Video Mixing Renderer');
            if Failed(Hr) then
            begin
              ErrorMessage := 'Could not add "Video Mixing Renderer" filter.';
              Exit;
            end;
            // récupération de l'interface
            Hr := VideoMixingRendererFilter.QueryInterface(IID_IVMRFilterConfig9, VideoMixingRendererInterface);
            if Failed(Hr) then
            begin
              ErrorMessage := 'Filter "Video Mixing Renderer" interface not found.';
              Exit;
            end;
            // mode windowless 
            Hr := VideoMixingRendererInterface.SetRenderingMode(VMRMode_Windowless);
            VideoMixingRendererInterface := nil;
            if not Failed(Hr) then
            begin
              // prendre le controle and régler la fenêtre
              Hr := VideoMixingRendererFilter.QueryInterface(IID_IVMRWindowlessControl9, DirectShowGraph.FVideoMixingRendererControl);
              if not Failed(Hr) then
              begin
                Hr := DirectShowGraph.FVideoMixingRendererControl.SetVideoClippingWindow(Owner);
                if Failed(hr) then
                  DirectShowGraph.FVideoMixingRendererControl := nil;
              end;
            end;
            VideoMixingRendererFilter := nil;
          end;
     
        //******************************************************************************
        // rajout d'un filtre Grabber
        //*********************************************************************************
       Hr := CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC, IID_IBaseFilter,DirectShowGraph.FSampleGrabber);
            if Failed(Hr) then
            begin
              ErrorMessage := 'Could not use a Sample Grabber.';
              Exit;
            end;
     
           hr := DirectShowGraph.FgraphBuilder.AddFilter(DirectShowGraph.FSampleGrabber, 'Sample Grabber'); // voir cela est fait plus loin
            if Failed(Hr) then
            begin
              ErrorMessage := 'Could not add "Sample Grabber" filter.';
              Exit;
            end;
     
            // avant de l'ajouter il faut régler le type de media
           // avant d'adjoindre SampleGrabber il faut lui indiquer le mediatype qu'il va gérer pour ne pas le laisser aller chercher
           // d'autres format et faire des transformations
     
           // récupérer l'interface
            hr := DirectShowGraph.FSampleGrabber.QueryInterface(IID_ISampleGrabber,DirectShowGraph.FSampleGrabberInterface);
            if Failed(Hr) then
            begin
              ErrorMessage := 'Filter "Sample Grabber" interface not found.';
              Exit;
            end;
     
          // setmediatype  
            ZeroMemory(@media_type, sizeof(AM_MEDIA_TYPE));
            media_type.majortype:= MEDIATYPE_Video;
            media_type.subtype:= MEDIASUBTYPE_RGB32;   
            // il faudrait peut-être rajouter le format Type ????
     
            hr:= DirectShowGraph.FSampleGrabberInterface.SetMediaType(media_type);
     
    		// tout fonctionne bien sous XP
    		// sous Win7 il faut ajouter un Colore Converter DMO
     
        hr := CoCreateInstance(CLSID_ColorConverterDMO, nil, CLSCTX_INPROC, IMediaObject,DirectShowGraph.iDMOobjet);
        hr := CoCreateInstance(CLSID_DMOWrapperFilter, nil, CLSCTX_INPROC, IID_IBaseFilter,DirectShowGraph.FColorConverterDMO);
         //hr := CoCreateInstance(CLSID_DMOWrapperFilter, nil, CLSCTX_INPROC_SERVER, IBaseFilter,iFilter);
        if succeeded(hr) then
          begin
          hr := DirectShowGraph.FColorConverterDMO.QueryInterface(IDMOWrapperFilter, DirectShowGraph.DMOWrapper);
          if Succeeded(hr) then
            begin
              hr := DirectShowGraph.DMOWrapper.Init(CLSID_ColorConverterDMO, DMOCATEGORY_VIDEO_EFFECT);
     
              DirectShowGraph.DMOWrapper := nil;
              if Succeeded(hr) then
                begin
                  Hr := DirectShowGraph.FGraphBuilder.AddFilter(DirectshowGraph.FColorConverterDMO, 'Color Converter DMO');
                  if Failed(Hr) then
                    begin
                      ErrorMessage := 'Could not add "Color Converter DMO" filter.';
                      Exit;
                    end;
                end
              else
                begin
                  ErrorMessage := 'Could not init "Color Converter DMO" filter.';
                  Exit;
                end;
            end;
          end;
     
    	 // insertion du demultiplexer et autres éléments
         // ...
    	 // ...
    	 // le graphe finit de se construire par lui même
     
    	  if not Assigned(DirectShowGraph.FVideoPin) then
          begin
            Hr := DirectShowGraph.FMpeg2DemultiplexerFilter.FindPin('2', DirectShowGraph.FVideoPin);
            if Failed(Hr) then
            begin
              ErrorMessage := 'Filter demultiplexer video pin not found.';
              Exit;
            end;
          end;
     
          if not Assigned(DirectShowGraph.FAudioPin) then
          begin
            Hr := DirectShowGraph.FMpeg2DemultiplexerFilter.FindPin('3', DirectShowGraph.FAudioPin);
            if Failed(Hr) then
            begin
              ErrorMessage := 'Filter demultiplexer audio pin not found.';
              Exit;
            end;
          end;
     
          // demande du rendu automatique
          DirectShowGraph.FGraphBuilder.Render(DirectShowGraph.FVideoPin);
          DirectShowGraph.FGraphBuilder.Render(DirectShowGraph.FAudioPin);
     
     
          if Assigned(DirectShowGraph.FColorConverterDMO) then
          begin
            DirectShowGraph.FColorConverterDMO.SetSyncSource(nil);
          end;
     
          if Assigned(DirectShowGraph.FMpeg2DemultiplexerFilter) then
          begin
            DirectShowGraph.FMpeg2DemultiplexerFilter.SetSyncSource(nil);
            DirectShowGraph.FGraphBuilder.SetDefaultSyncSource;
          end;
     
    	  // récupération des interface des flux audio et vidéo pour futur décodage des PIDs
          Hr := DirectShowGraph.FVideoPin.QueryInterface(IID_IMPEG2PIDMap, DirectShowGraph.FVideoStreamMap);
          if Failed(Hr) then
          begin
            ErrorMessage := 'Filter video stream interface not found.';
            Exit;
          end;
     
          Hr := DirectShowGraph.FAudioPin.QueryInterface(IID_IMPEG2PIDMap, DirectShowGraph.FAudioStreamMap);
          if Failed(Hr) then
          begin
            ErrorMessage := 'Filter audio stream interface not found.';
            Exit;
          end;
     
    	 //...
    Que manque t-il dans ma gestion du filtre DMO? ou quelle piste chercher?

    Merci d'avance.
    JP
    Images attachées Images attachées   

Discussions similaires

  1. Trois problèmes avec GTK+ sous windows xp qui n'ont pas de solutions
    Par smalldebian dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 16/09/2009, 15h01
  2. Problème avec EInOutError sous delphi 2005
    Par Teb dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2005, 11h48
  3. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 09h33
  4. Problème avec glutFullScreen() sous linux...
    Par MaxPayne dans le forum OpenGL
    Réponses: 1
    Dernier message: 29/11/2004, 11h30
  5. Problème avec CopyDir sous D5
    Par Houben Jacques dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 22h02

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