Einführung in die DirectShow-Filterentwicklung

[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.]

Dieser Abschnitt enthält eine kurze Beschreibung der Aufgaben, die mit der Entwicklung eines benutzerdefinierten DirectShow-Filters verbunden sind. Außerdem werden Links zu Themen bereitgestellt, in denen diese Aufgaben ausführlicher erläutert werden. Lesen Sie vor dem Lesen dieses Abschnitts die Themen unter Informationen zu DirectShow, in denen die gesamte DirectShow-Architektur beschrieben wird.

DirectShow-Basisklassenbibliothek

Das DirectShow SDK enthält eine Reihe von C++-Klassen zum Schreiben von Filtern. Obwohl sie nicht erforderlich sind, sind diese Klassen die empfohlene Methode, um einen neuen Filter zu schreiben. Um die Basisklassen zu verwenden, kompilieren Sie sie in eine statische Bibliothek, und verknüpfen Sie die LIB-Datei mit Ihrem Projekt, wie unter Erstellen von DirectShow-Filtern beschrieben.

Die Basisklassenbibliothek definiert eine Stammklasse für Filter, die CBaseFilter-Klasse . Mehrere andere Klassen werden von CBaseFilter abgeleitet und sind auf bestimmte Filtertypen spezialisiert. Die CTransformFilter-Klasse ist beispielsweise für Transformationsfilter konzipiert. Um einen neuen Filter zu erstellen, implementieren Sie eine Klasse, die von einer der Filterklassen erbt. Ihre Klassendeklaration kann z. B. wie folgt aussehen:

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

Weitere Informationen zu den DirectShow-Basisklassen finden Sie in den folgenden Themen:

Erstellen von Pins

Ein Filter muss einen oder mehrere Pins erstellen. Die Anzahl der Pins kann zur Entwurfszeit festgelegt werden, oder der Filter kann bei Bedarf neue Pins erstellen. Pins werden in der Regel von der CBasePin-Klasse oder von einer Klasse abgeleitet, die CBasePin erbt, z. B. CBaseInputPin. Die Pins des Filters sollten als Membervariablen in der Filterklasse deklariert werden. Einige der Filterklassen definieren bereits die Pins, aber wenn Ihr Filter direkt von CBaseFilter erbt, müssen Sie die Pins in Ihrer abgeleiteten Klasse deklarieren.

Aushandeln von Pinverbindungen

Wenn der Filter Graph-Manager versucht, zwei Filter zu verbinden, müssen sich die Pins auf verschiedene Dinge einigen. Wenn dies nicht der Fehler ist, schlägt der Verbindungsversuch fehl. Im Allgemeinen verhandeln Pins Folgendes:

  • Transport: Der Transport ist der Mechanismus, den die Filter verwenden, um Medienbeispiele vom Ausgabepin zum Eingabestift zu verschieben. Sie können beispielsweise die IMemInputPin-Schnittstelle ("Pushmodell") oder die IAsyncReader-Schnittstelle ("Pullmodell") verwenden.
  • Medientyp. Fast alle Pins verwenden Medientypen, um das Format der daten zu beschreiben, die sie liefern.
  • Zuweisung. Die Zuweisung ist das Objekt, das die Puffer erstellt, die die Daten enthalten. Die Pins müssen zustimmen, welche Pin die Zuweisung bereitstellt. Sie müssen sich auch auf die Größe der Puffer, die Anzahl der zu erstellenden Puffer und andere Puffereigenschaften einigen.

Die Basisklassen implementieren ein Framework für diese Verhandlungen. Sie müssen die Details abschließen, indem Sie verschiedene Methoden in der Basisklasse überschreiben. Der Satz von Methoden, die Sie überschreiben müssen, hängt von der -Klasse und der Funktionalität Ihres Filters ab. Weitere Informationen finden Sie unter Herstellen einer Verbindung mit Filtern.

Verarbeiten und Übermitteln von Daten

Die primäre Funktion der meisten Filter besteht darin, Mediendaten zu verarbeiten und bereitzustellen. Wie dies geschieht, hängt vom Typ des Filters ab:

  • Eine Pushquelle verfügt über einen Workerthread, der kontinuierlich Beispiele mit Daten füllt und diese nach unten übermittelt.
  • Eine Pullquelle wartet darauf, dass ihr Downstreamnachbar ein Beispiel angibt. Es antwortet, indem Daten in ein Beispiel geschrieben und das Beispiel an den downstream-Filter bereitgestellt wird. Der Downstreamfilter erstellt den Thread, der den Datenfluss steuert.
  • Ein Transformationsfilter enthält Beispiele, die ihm von seinem Upstream Nachbarn übermittelt werden. Wenn es ein Beispiel empfängt, verarbeitet es die Daten und übermittelt sie nachgeschaltet.
  • Ein Rendererfilter empfängt Beispiele von Upstream und plant deren Rendering basierend auf den Zeitstempeln.

Weitere Aufgaben im Zusammenhang mit dem Streaming sind das Leeren von Daten aus dem Diagramm, das Behandeln des Endes des Datenstroms und das Reagieren auf Suchanforderungen. Weitere Informationen zu diesen Problemen finden Sie in den folgenden Themen:

Unterstützen von COM

DirectShow-Filter sind COM-Objekte, die in der Regel in DLLs verpackt sind. Die Basisklassenbibliothek implementiert ein Framework für die Unterstützung von COM. Dies wird im Abschnitt DirectShow und COM beschrieben.

Schreiben von DirectShow-Filtern