Freigeben über


Schritt 1: Auswählen einer Basisklasse

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

Dies ist Schritt 1 des Tutorials Schreiben von Transformationsfiltern.

Wenn Sie sich entscheiden, einen Filter und nicht einen DMO zu schreiben, ist der erste Schritt die Auswahl der zu verwendenden Basisklasse. Die folgenden Klassen eignen sich für Transformationsfilter:

  • CTransformFilter wurde für Transformationsfilter entwickelt, die separate Eingabe- und Ausgabepuffer verwenden. Diese Art von Filter wird manchmal auch als Kopiertransformationsfilter bezeichnet. Wenn ein Kopiertransformationsfilter ein Eingabebeispiel empfängt, schreibt er neue Daten in ein Ausgabebeispiel und übermittelt das Ausgabebeispiel an den nächsten Filter.

  • CTransInPlaceFilter ist für Filter konzipiert, die Daten im ursprünglichen Puffer ändern, auch als trans-in-place-Filter bezeichnet. Wenn ein trans-in-situ-Filter eine Probe empfängt, ändert er die Daten innerhalb dieses Beispiels und liefert die gleiche Probe nachgeschaltet. Der Eingabenadel und der Ausgabepin des Filters stellen immer eine Verbindung mit übereinstimmenden Medientypen her.

  • CVideoTransformFilter ist in erster Linie für Videodecoder konzipiert. Er wird von CTransformFilter abgeleitet, enthält jedoch Funktionen zum Löschen von Frames, wenn der downstream-Renderer in Rückstand gerät.

  • CBaseFilter ist eine generische Filterklasse. Die anderen Klassen in dieser Liste werden alle von CBaseFilter abgeleitet. Wenn keiner von ihnen geeignet ist, können Sie auf diese Klasse zurückgreifen. Diese Klasse erfordert jedoch auch die meisten Arbeit ihrerseits.

  • ![Wichtig]

    Direkte Videotransformationen können erhebliche Auswirkungen auf die Renderingleistung haben. Für direkte Transformationen sind Lese-,Änderungs- und Schreibvorgänge für den Puffer erforderlich. Wenn sich der Arbeitsspeicher in einem Grafik-Karte befindet, sind Lesevorgänge erheblich langsamer. Darüber hinaus kann selbst eine Kopiertransformation unbeabsichtigte Lesevorgänge verursachen, wenn Sie sie nicht sorgfältig implementieren. Daher sollten Sie immer Leistungstests durchführen, wenn Sie eine Videotransformation schreiben.

     

Für den Beispiel-RLE-Encoder ist die beste Wahl entweder CTransformFilter oder CVideoTransformFilter. Tatsächlich sind die Unterschiede zwischen ihnen größtenteils intern, sodass es leicht ist, von einem zum anderen zu konvertieren. Da die Medientypen auf den beiden Pins unterschiedlich sein müssen, ist die CTransInPlaceFilter-Klasse für diesen Filter nicht geeignet. In diesem Beispiel wird CTransformFilter verwendet.

Weiter: Schritt 2. Deklarieren Sie die Filterklasse.

Schreiben von DirectShow-Filtern