次の方法で共有


カスタム ファイルの種類の登録

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

この記事では、フィルター グラフ マネージャーでファイル名を指定してソース フィルターを検索する方法について説明します。 このメカニズムを使用して、独自のカスタム ファイルの種類を登録できます。 ファイルの種類が登録されると、アプリケーションが IGraphBuilder::RenderFile または IGraphBuilder::AddSourceFilter を呼び出すたびに、DirectShow によって正しいソース フィルターが自動的に読み込まれます。

概要

特定のファイル名からソース フィルターを見つけるために、フィルター グラフ マネージャーは次の操作を順番に実行しようとします。

  1. プロトコル (存在する場合) と一致します。
  2. ファイル拡張子と一致します。
  3. チェック バイトと呼ばれる、ファイル内のバイトのパターンと一致します

プロトコル

"ftp" や "http" などのプロトコル名は、

HKEY_CLASSES_ROOT

キー。次の構造を使用します。

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

ファイル名または URL にコロン (':') が含まれている場合、Filter Graph Manager はプロトコル名として ':' の前の部分を使用しようとします。 たとえば、名前が "myprot://myfile.ext" の場合は、 myprot という名前のレジストリ キーを検索します。 このキーが存在し、"Extensions" という名前のサブキーが含まれている場合、フィルター グラフ マネージャーはそのサブキー内でファイル拡張子と一致するエントリを検索します。 キーの値は、文字列形式の GUID である必要があります。たとえば、"{00000000-0000-0000-0000-000000000000}" です。 フィルター グラフ マネージャーが Extensions サブキー内の何も一致しない場合は、 Source Filter という名前のサブキーが検索されます。これは、文字列形式の GUID である必要もあります。

フィルター グラフ マネージャーは、一致する GUID を見つけた場合、これをソース フィルターの CLSID として使用し、フィルターの読み込みを試みます。 一致するものが見つからない場合は、ファイル名を URL として扱う [ファイル ソース (URL)] フィルターが使用されます。

このアルゴリズムには 2 つの例外があります。

  • ドライバー文字を除外するために、1 文字の文字列はプロトコルとは見なされません。
  • 文字列が "file:" または "file://" の場合、プロトコルとして扱われません。

ファイル拡張子

ファイル名にプロトコルがない場合、Filter Graph Manager は 、キーが HKEY_CLASSES_ROOT\Media Type\Extensions\のエントリをレジストリで検索します。ext\,where .ext はファイル拡張子です。 このキーが存在する場合、 値 Source Filter には、ソース フィルターの CLSID が文字列形式で含まれます。 必要に応じて、キーに [メディアの種類] と [ サブタイプ] の値を指定し、メジャー型とサブタイプ GUID を指定できます。

バイト数の確認

一部のファイルの種類は、ファイル内の特定のバイト オフセットで発生するビットの特定のパターンによって識別できます。 Filter Graph Manager は、レジストリで次の形式のキーを検索します。

HKEY_CLASSES_ROOT\MediaType\{ メジャー型 }\{ サブタイプ }

ここで、メジャー型サブタイプは、バイト ストリームのメディアの種類を定義する GUID です。 各キーには、1 つ以上のサブキー (通常は 1、2 など) が含まれています。これは、チェック バイトを定義します。また、ソース フィルターの CLSID を文字列形式で指定する Source Filter という名前のサブキーが含まれます。 チェックバイト サブキーは、次の 1 つ以上の四角形の数値を含む文字列です。

offsetcbmaskval

ファイルに一致させるために、Filter Graph Manager はバイト番号オフセットから始まる cb バイトを読み取ります。 次に、mask の値に対してビットごとの AND を実行します。 結果が val と等しい場合、ファイルはその四角形に一致します。 値 mask と val は 16 進数で指定されます。 mask の空白のエントリは、長さ cb の 1 の文字列として扱われます。 offset の負の値は、ファイルの末尾からのオフセットを示します。 キーと一致させるには、ファイルがいずれかのサブキー内のすべての四角形と一致している必要があります。

たとえば、レジストリに 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}"

最初のキーは、MEDIATYPE_Streamメジャー型に対応します。 サブタイプ MEDIATYPE_Midiに対応する以下のサブキー。 ソース フィルター サブキーの値は、 ファイル ソース (Async) フィルターの CLSID CLSID_AsyncReader。

各エントリには複数の 4 倍を指定できます。これらのすべてが一致している必要があります。 次の例では、ファイルの最初の 4 バイトは、0xAB、0xCD、0x12、0x34である必要があります。ファイルの最後の 4 バイトは、0xAB、0xAB、0x00、0xABである必要があります。

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

また、1 つのメディアの種類の下に複数のエントリが一覧表示される場合もあります。 それらのいずれかに一致するだけで十分です。 このスキームでは、一連の代替マスクを使用できます。たとえば、RIFF ヘッダーがある場合とない可能性がある .wav ファイルなどです。

注意

このスキームは、 GetClassFile 関数で使用されるスキームと似ています。

 

ソース フィルターの読み込み

Filter Graph Manager がファイルの一致するソース フィルターを見つけると仮定すると、そのフィルターがグラフに追加され、 IFileSourceFilter インターフェイスのフィルターに対してクエリが実行され、 IFileSourceFilter::Load が呼び出されます。 Load メソッドの引数は、レジストリから決定されるファイル名とメディアの種類です。

Filter Graph Manager がレジストリから何も見つからない場合、既定では非同期ファイル ソース フィルターが使用されます。 その場合は、メディアの種類を MEDIATYPE_Stream に設定 MEDIASUBTYPE_None

Windows メディア プレーヤーのカスタム ファイルの種類

Windows メディア プレーヤーは、追加のレジストリ エントリのセットを使用します。 詳細については、「Windows メディア プレーヤー SDK のファイル名拡張子レジストリ設定」を参照してください。

DirectShow フィルターの作成