Registrieren eines benutzerdefinierten Dateityps

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

In diesem Artikel wird beschrieben, wie der Filter Graph Manager einen Quellfilter unter Angabe eines Dateinamens findet. Sie können diesen Mechanismus verwenden, um Ihre eigenen benutzerdefinierten Dateitypen zu registrieren. Sobald der Dateityp registriert wurde, lädt DirectShow automatisch den richtigen Quellfilter, wenn eine Anwendung IGraphBuilder::RenderFile oder IGraphBuilder::AddSourceFilter aufruft.

Übersicht

Um einen Quellfilter aus einem angegebenen Dateinamen zu suchen, versucht der Filter Graph-Manager, die folgenden Schritte auszuführen:

  1. Stimmen Sie ggf. mit dem Protokoll überein.
  2. Stimmen Sie mit der Dateierweiterung überein.
  3. Übereinstimmungsmuster von Bytes in der Datei, die als Prüfbytes bezeichnet werden.

Protokolle

Protokollnamen wie "ftp" oder "http" werden unter dem

HKEY_CLASSES_ROOT

schlüssel mit der folgenden Struktur:

HKEY_CLASSES_ROOT
    <protocol>
        Source Filter = <Source filter CLSID>
        Extensions
            <.ext1> = <Source filter CLSID>
            <.ext2> = <Source filter CLSID>

Wenn der Dateiname oder die URL einen Doppelpunkt (':') enthält, versucht der Filter Graph-Manager, den Teil vor dem ":" als Protokollnamen zu verwenden. Wenn der Name beispielsweise "myprot://myfile.ext" lautet, wird nach einem Registrierungsschlüssel namens myprot gesucht. Wenn dieser Schlüssel vorhanden ist und einen Unterschlüssel mit dem Namen "Extensions" enthält, sucht der Filter Graph Manager in diesem Unterschlüssel nach Einträgen, die der Dateierweiterung entsprechen. Der Wert des Schlüssels muss eine GUID in Zeichenfolgenform sein. Beispiel: "{00000000-0000-0000-0000-000000000000}". Wenn der Filter Graph-Manager innerhalb des Unterschlüssels Erweiterungen nichts übereinstimmen kann, sucht er nach einem Unterschlüssel namens Quellfilter, bei dem es sich auch um eine GUID in Zeichenfolgenform handeln muss.

Wenn der Filter graph-Manager eine übereinstimmende GUID findet, verwendet er diese als CLSID des Quellfilters und versucht, den Filter zu laden. Wenn keine Übereinstimmung gefunden wird, wird der Dateiquellenfilter (URL) verwendet, der den Dateinamen als URL behandelt.

Es gibt zwei Ausnahmen für diesen Algorithmus:

  • Um Treiberbuchstaben auszuschließen, werden einstellige Zeichenfolgen nicht als Protokolle betrachtet.
  • Wenn die Zeichenfolge "file:" oder "file://" ist, wird sie nicht als Protokoll behandelt.

Dateierweiterungen

Wenn im Dateinamen kein Protokoll enthalten ist, sucht der Filter Graph-Manager in der Registrierung nach Einträgen mit dem Schlüssel HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, wobei . ext ist die Dateierweiterung. Wenn dieser Schlüssel vorhanden ist, enthält der Wert Quellfilter die CLSID des Quellfilters in Zeichenfolgenform. Optional kann der Schlüssel Werte für Medientyp und Untertyp aufweisen, die den Haupttyp- und Untertyp-GUIDs geben.

Bytes überprüfen

Einige Dateitypen können durch bestimmte Muster von Bits identifiziert werden, die an bestimmten Byteoffsets in der Datei auftreten. Der Filter Graph-Manager sucht in der Registrierung nach Schlüsseln mit der folgenden Form:

HKEY_CLASSES_ROOT\MediaType\{ Haupttyp }\{ Untertyp }

wobei Haupttyp und Untertyp GUIDs sind, die den Medientyp für den Bytestream definieren. Jeder Schlüssel enthält einen oder mehrere Unterschlüssel mit dem Namen 1, 2 usw., die die Prüfbytes definieren. und einen Unterschlüssel namens Quellfilter , der die CLSID des Quellfilters in Zeichenfolgenform angibt. Bei den Check-Byte-Unterschlüsseln handelt es sich um Zeichenfolgen, die ein oder mehrere Vierecks von Zahlen mit dem Namen enthalten:

offset, cb, mask, val

Um der Datei zu entsprechen, liest der Graph-Filter-Manager cb Bytes, beginnend mit dem Bytezahlenoffset. Anschließend wird ein bitweises AND für den Wert in der Maske ausgeführt. Wenn das Ergebnis val entspricht, ist die Datei eine Übereinstimmung mit diesem Quad. Die Werte maskieren und val werden im Hex angegeben. Ein leerer Eintrag für die Maske wird als Zeichenfolge von 1s der Länge cb behandelt. Ein negativer Wert für offset gibt einen Offset vom Ende der Datei an. Um mit dem Schlüssel zu übereinstimmen, muss die Datei mit allen Quads in einem der Unterschlüssel übereinstimmen.

Angenommen, die Registrierung enthält die folgenden Schlüssel unter HKCR\Media Type:

{e436eb83-524f-11ce-9f53-0020af0ba770}
    {7364696D-0000-0010-8000-00AA00389B71}
        0                    "0,4,,52494646,8,4,,524D4944"
        1                    "0,4,,4D546864"
        Source Filter        "{E436EBB5-524F-11CE-9F53-0020AF0BA770}"

Der erste Schlüssel entspricht dem Haupttyp MEDIATYPE_Stream. Der untere Unterschlüssel, der dem Untertyp MEDIATYPE_Midi entspricht. Der Wert für den Quellfilter-Unterschlüssel ist CLSID_AsyncReader, die CLSID des Dateiquellefilters (Asynchron).

Jeder Eintrag kann mehrere Vierfache aufweisen. alle müssen übereinstimmen. Im folgenden Beispiel müssen die ersten 4 Bytes der Datei 0xAB, 0xCD, 0x12, 0x34; und die letzten 4 Bytes der Datei müssen 0xAB, 0xAB, 0x00, 0xAB sein:

    0, 4, , ABCD1234,  -4, 4, , ABAB00AB 

Außerdem können mehrere Einträge unter einem einzelnen Medientyp aufgeführt sein. Eine Übereinstimmung mit einer dieser Elemente ist ausreichend. Dieses Schema ermöglicht eine Reihe alternativer Masken; für instance. WAV-Dateien, die möglicherweise über einen RIFF-Header verfügen oder nicht.

Hinweis

Dieses Schema ähnelt dem von der GetClassFile-Funktion verwendeten Schema.

 

Laden des Quellfilters

Wenn der Filter Graph-Manager einen übereinstimmenden Quellfilter für die Datei findet, fügt er diesen Filter dem Diagramm hinzu, fragt den Filter für die IFileSourceFilter-Schnittstelle ab und ruft IFileSourceFilter::Load auf. Die Argumente für die Load-Methode sind der Dateiname und der Medientyp, wie von der Registrierung bestimmt.

Wenn der Filter Graph-Manager nichts aus der Registrierung finden kann, verwendet er standardmäßig den Asynchronen Dateiquellenfilter. In diesem Fall wird der Medientyp auf MEDIATYPE_Stream festgelegt, MEDIASUBTYPE_None.

Benutzerdefinierte Dateitypen in Windows Medienwiedergabe

Windows Medienwiedergabe verwendet einen zusätzlichen Satz von Registrierungseinträgen. Weitere Informationen finden Sie unter Registrierungseinstellungen für die Dateinamenerweiterung im Windows Medienwiedergabe SDK.

Schreiben von DirectShow-Filtern