Comment capturer des images à l'aide de Delphi/DSPack sans les afficher sur TVideoWindow ?

StackOverflow https://stackoverflow.com//questions/12680600

  •  12-12-2019
  •  | 
  •  

Question

DSpack contient un exemple de code pour lire un périphérique vidéo compatible DirectShow et capturer les images vidéo simultanément.Un TVideoWindow est attaché au FilterGraph pour afficher la vidéo (Firgure-1).Si vous supprimez TVideoWindow, le système d'exploitation (Windows) affichera automatiquement ActiveMovie et affichera la vidéo dans une fenêtre séparée (Figure 2).

Existe-t-il un moyen d'utiliser DSPack pour capturer des images vidéo sans utiliser aucun des composants de l'interface graphique et sans afficher la vidéo ?

Le forum DSPack fait mention du filtre NullRenderer, mais il n'y a aucune documentation ni exemple sur la façon de l'utiliser.Il semble que nous puissions y parvenir si nous remplaçons manuellement le moteur de rendu vidéo par Null Render directement dans GraphEdit (Figure 3).

Comment pouvons-nous obtenir le résultat présenté dans la figure 3 en effectuant toutes les manipulations dans le code ?DSPack n'explique pas comment créer un moteur de rendu Null.

Figure-1: The graph of the default example code

Figure-1

Figure-2: Shows what happens if I remove the TVideoWindow

Figure-2

Figure-3: Shows what happens if I replace Video Renderer with a 
         Null Renderer and manually connect them in the GraphEdit. 

Figure-3

C'est ce que j'ai fini par faire (jusqu'à présent)

Appelez le suivant ReassignSampleGrabberOutput juste avant filterGraph.Play;

procedure TForm1.ReassignSampleGrabberOutput;
var
  nullRenderer : IBaseFilter;
  nullRendererPins: IEnumPins;
  nullRendererPin : IPin;
  graph:   IGraphBuilder;
begin

  nullRenderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
  FilterGraph1.QueryInterface(IID_IGraphBuilder, graph);
  graph.AddFilter(nullRenderer, 'Null Renderer');

  nullRenderer.EnumPins(nullRendererPins);

  nullRendererPins.Reset;

  if nullRendererPins.Next(1, nullRendererPin, nil) = S_OK then
  begin
    //SampleGrabber1.OutPutPin.Disconnect;
    //SampleGrabber1.OutPutPin.Connect(nullRendererPin, nil);

    graph.Disconnect(SampleGrabber1.OutPutPin);
    graph.FindFilterByName('Video Renderer', filter);
    graph.RemoveFilter(filter);
    graph.Connect(SampleGrabber1.OutPutPin, nullRendererPin);

  end;
end;
Était-ce utile?

La solution

Null Renderer Filter est un filtre/classe standard.Dans le code, il vous suffit de l'instancier (CoCreateInstance), ajoutez-le au graphique et connectez sa broche d'entrée à la broche de sortie non connectée du Sample Grabber.

Dans Delphi/DSPack, cela devrait ressembler à ceci :

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top