Comment capturer des images à l'aide de Delphi/DSPack sans les afficher sur TVideoWindow ?
-
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-2: Shows what happens if I remove the TVideoWindow
Figure-3: Shows what happens if I replace Video Renderer with a
Null Renderer and manually connect them in the GraphEdit.
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;
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;