Freigeben über


Filterketten

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Eine Filterkette ist eine Sequenz von Filtern, die die folgenden Bedingungen erfüllt:

  • Jeder Filter in der Kette verfügt höchstens über einen angeschlossenen Eingabestift und einen angeschlossenen Ausgabestift.
  • Es ist möglich, jeden Filter in der Kette zu durchlaufen, ohne Filter außerhalb der Kette zu durchlaufen.

Im folgenden Diagramm sind die Filter A–B, C–D und F–G–H beispielsweise Filterketten. Jede Teilkette in F–G–H (F–G und G–H) ist ebenfalls eine Filterkette. Eine Filterkette kann aus einem einzelnen Filter bestehen, sodass filter A, B, C, D, F, G und H auch unterschiedliche Filterketten sind. Filter E verfügt über zwei Eingabeverbindungen, sodass jede Filtersequenz, die Filter E enthält, keine Filterkette ist.

Filterkette (Beispiel 1)

Die IFilterChain-Schnittstelle bietet die folgenden Methoden zum Steuern von Filterketten:

Bezeichnung Wert
IFilterChain::StartChain Startet eine Kette.
IFilterChain::StopChain Beendet eine Kette.
IFilterChain::P auseChain Hält eine Kette an.
IFilterChain::RemoveChain Entfernt eine Kette aus dem Diagramm.

 

Es gibt keine spezifische Methode zum Hinzufügen einer Kette. Um eine Kette hinzuzufügen, fügen Sie die neuen Filter mithilfe der IFilterGraph::AddFilter-Methode ein. Verbinden Sie dann die Filter, indem Sie IGraphBuilder::Connect, IGraphBuilder::Render oder ähnliche Methoden aufrufen.

Wenn das Diagramm ausgeführt wird, kann eine Filterkette zwischen ausgeführt und beendet wechseln. Wenn das Diagramm angehalten ist, kann es zwischen angehalten und beendet wechseln. Dies sind die einzigen Zustandsübergänge, die mit Filterketten möglich sind.

Richtlinien für Filterketten

Wenn Sie IFilterChain-Methoden verwenden, müssen Sie sicherstellen, dass die Filter im Graphen Filterkettenvorgänge unterstützen können. Andernfalls können Sie Deadlocks oder Graphfehler verursachen. Filter, die mit der Kette verbunden sind, müssen ordnungsgemäß funktionieren, nachdem sich der Status der Kette geändert hat.

Die beste Möglichkeit, IFilterChain zu verwenden, ist eine Reihe von Filtern, die Sie speziell für die Verkettung entwickelt haben. Verwenden Sie die folgenden Richtlinien, um sicherzustellen, dass Ihre Filter für Filterkettenvorgänge sicher sind. Diese Punkte beziehen sich auf das folgende Diagramm.

Filterkette (Beispiel 2)

  • Bevor sich der Status der Filterkette ändert, müssen alle Datenverarbeitungsaufrufe an der Grenze der Filterkette abgeschlossen werden. Diese Regel gilt für die Methoden IMemInputPin::Receive, IPin::NewSegment und IPin::EndOfStream. Filter in der Kette müssen von Aufrufen dieser Methoden zurückgegeben werden, die von Filtern außerhalb der Kette vorgenommen werden. und Filter außerhalb der Kette müssen von Aufrufen von Filtern innerhalb der Kette zurückgegeben werden.

Beispielsweise muss filter B im vorherigen Diagramm alle Datenverarbeitungsaufrufe aus Filter A abschließen, und Filter E muss alle Aufrufe von Filter D beenden. Wenn die Pins die IPinFlowControl - und IPinConnection-Schnittstellen verfügbar machen, können Sie die Daten durch das Diagramm übertragen, indem Sie die Methoden IPinFlowControl::Block und IGraphConfig::P ushThroughData aufrufen, wie unter Dynamische Erneute Verbindung beschrieben. Filter können auch private Methoden zum Pushen der Daten unterstützen.

  • Upstreamfilter müssen erwarten, dass sich der Status der Kette ändert. Angenommen, im vorherigen Diagramm ist die Kette beendet, filtert aber A ruft IMemInputPin::Receive auf. Der Aufruf schlägt fehl, und die Antwort von Filter A besteht darin, das Streaming zu beenden. Wenn die Anwendung die Kette neu startet, hat dies keine Auswirkungen, da Filter A keine Daten mehr streamt.
  • Nachgeschaltete Filter müssen auch erwarten, dass sich der Status der Kette ändert. Andernfalls blockiert der Downstreamfilter möglicherweise, während er auf Beispiele wartet, die nie eintreffen. Multiplexer-Filter (MUX) benötigen beispielsweise häufig Daten von allen Eingabenadeln. Das Anhalten des Datenflusses von einem Eingabepin kann die Verarbeitung der anderen Datenströme blockieren. Dies kann zu einem Deadlock des Diagramms führen.
  • Jede Pinverbindung von einem Filter außerhalb der Kette zu einem Filter innerhalb der Kette sollte über eine eigene Zuweisung verfügen, die von anderen Verbindungen nicht gemeinsam genutzt wird. Wenn die Kette den Zustand ändert oder aus dem Diagramm entfernt wird, wird die Zuweisung möglicherweise aufgehoben. Wenn andere Verbindungen dieselbe Zuweisung verwenden, können sie keine Proben mehr verarbeiten.
  • Entfernen Sie eine Kette nur, wenn die mit der Kette verbundenen Filter die dynamische Trennung unterstützen. In der Regel unterstützen die verbundenen Filter die IPinConnection- oder IPinFlowControl-Schnittstelle , unterstützen aber möglicherweise stattdessen private Schnittstellen.

Erstellen dynamischer Diagramme