Frage

DSpack verfügt über Beispielcode zum Abspielen eines DirectShow-kompatiblen Videogeräts und zum gleichzeitigen Erfassen der Videobilder.An den FilterGraph wird ein TVideoWindow angehängt, um das Video anzuzeigen (Abbildung 1).Wenn Sie TVideoWindow entfernen, ruft das Betriebssystem (Windows) automatisch ActiveMovie auf und zeigt das Video in einem separaten Fenster an (Abbildung 2).

Gibt es eine Möglichkeit, mit DSPack Videobilder aufzunehmen, ohne GUI-Komponenten zu verwenden und ohne das Video anzuzeigen?

Im DSPack-Forum wird der NullRenderer-Filter erwähnt, es gibt jedoch keine Dokumentation oder Beispiele für seine Verwendung.Sieht so aus, als ob wir das erreichen können, wenn wir den Video-Renderer direkt im GraphEdit manuell durch Null-Renderer ersetzen (Abbildung 3).

Wie können wir das in Abbildung 3 gezeigte Ergebnis erzielen, indem wir alle Manipulationen innerhalb des Codes vornehmen?DSPack erklärt nicht, wie ein Null-Renderer erstellt wird.

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

Das ist es, was ich letztendlich getan habe (bisher)

Rufen Sie Folgendes an ReassignSampleGrabberOutput kurz bevor 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;
War es hilfreich?

Lösung

Null Renderer Filter ist ein Standardfilter/eine Standardklasse.Im Code müssen Sie es nur instanziieren (CoCreateInstance), fügen Sie es dem Diagramm hinzu und verbinden Sie seinen Eingangspin mit dem nicht verbundenen Ausgangspin des Sample Grabbers.

In Delphi/DSPack sollte es so aussehen:

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top