フィルター マッパーの使用

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

Filter Mapper は、さまざまな検索条件に基づいて DirectShow フィルターを列挙する COM オブジェクトです。 フィルター マッパーはシステム デバイス列挙子よりも効率が低い場合があるため、特定のカテゴリのフィルターが必要な場合は、システム デバイス列挙子を使用する必要があります。 ただし、メディアの種類の特定の組み合わせをサポートしているが、明確なカテゴリに分類されないフィルターを見つける必要がある場合は、フィルター マッパーを使用する必要があります。 (レンダラー フィルターまたはデコーダー フィルターなど)。

フィルター マッパーは 、IFilterMapper2 インターフェイスを 公開します。 フィルターを検索するには、 IFilterMapper2::EnumMatchingFilters メソッドを 呼び出します。 このメソッドは、検索条件を定義する複数のパラメーターを受け取り、一致するフィルターの列挙子を返します。 列挙子は IEnumMoniker インターフェイスをサポートし、一致するフィルターごとに一意のモニカーを提供します。

次の例では、デジタル ビデオ (DV) 入力を受け入れ、任意のメディアの種類の少なくとも 1 つの出力ピンを持つフィルターを列挙します。 ( DV ビデオ デコーダー フィルターは、これらの条件と一致します)。

IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;

hr = CoCreateInstance(CLSID_FilterMapper2, 
    NULL, CLSCTX_INPROC, IID_IFilterMapper2, 
    (void **) &pMapper);

if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;

hr = pMapper->EnumMatchingFilters(
        &pEnum,
        0,                  // Reserved.
        TRUE,               // Use exact match?
        MERIT_DO_NOT_USE+1, // Minimum merit.
        TRUE,               // At least one input pin?
        1,                  // Number of major type/subtype pairs for input.
        arrayInTypes,       // Array of major type/subtype pairs for input.
        NULL,               // Input medium.
        NULL,               // Input pin category.
        FALSE,              // Must be a renderer?
        TRUE,               // At least one output pin?
        0,                  // Number of major type/subtype pairs for output.
        NULL,               // Array of major type/subtype pairs for output.
        NULL,               // Output medium.
        NULL);              // Output pin category.

// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
    IPropertyBag *pPropBag = NULL;
    hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
       (void **)&pPropBag);

    if (SUCCEEDED(hr))
    {
        // To retrieve the friendly name of the filter, do the following:
        VARIANT varName;
        VariantInit(&varName);
        hr = pPropBag->Read(L"FriendlyName", &varName, 0);
        if (SUCCEEDED(hr))
        {
            // Display the name in your UI somehow.
        }
        VariantClear(&varName);

        // To create an instance of the filter, do the following:
        IBaseFilter *pFilter;
        hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
        // Now add the filter to the graph. Remember to release pFilter later.
    
        // Clean up.
        pPropBag->Release();
    }
    pMoniker->Release();
}

// Clean up.
pMapper->Release();
pEnum->Release();

EnumMatchingFilters メソッドには非常に多くのパラメーターがあり、この例ではコメントされています。 この例の重要なものは次のとおりです。

  • 最小メリット値: フィルターには、MERIT_DO_NOT_USEを超えたメリット値が必要です。
  • 入力型: 呼び出し元は、メジャー型とサブタイプのペアを含む配列を渡します。 これらのペアのうち少なくとも 1 つをサポートするフィルターのみが一致します。
  • 完全一致: フィルターは、メジャー型、サブタイプ、ピン カテゴリ、または中の NULL 値を登録できます。 完全一致を指定しない限り、 NULL 値はワイルドカードとして機能し、指定した値と一致します。 完全一致では、フィルターは条件と完全に一致する必要があります。 ただし、検索条件に NULL パラメーターを指定すると、常にワイルドカードまたは "注意しない" 値として機能し、フィルターと一致します。

デバイスとフィルターの列挙

インテリジェント接続