Поделиться через


Добавление фильтра по CLSID

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Следующая функция создает фильтр с указанным идентификатором класса (CLSID) и добавляет его в граф фильтра:

// Create a filter by CLSID and add it to the graph.

HRESULT AddFilterByCLSID(
    IGraphBuilder *pGraph,      // Pointer to the Filter Graph Manager.
    REFGUID clsid,              // CLSID of the filter to create.
    IBaseFilter **ppF,          // Receives a pointer to the filter.
    LPCWSTR wszName             // A name for the filter (can be NULL).
    )
{
    *ppF = 0;

    IBaseFilter *pFilter = NULL;
    
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pFilter));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pGraph->AddFilter(pFilter, wszName);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppF = pFilter;
    (*ppF)->AddRef();

done:
    SafeRelease(&pFilter);
    return hr;
}

Примечание

В этом примере функция SafeRelease используется для освобождения указателя IBaseFilter .

 

Функция вызывает CoCreateInstance для создания фильтра, а затем вызывает IFilterGraph::AddFilter , чтобы добавить фильтр в граф. В следующем примере кода эта функция используется для добавления фильтра AVI Mux в граф:

IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux, NULL); 
if (SUCCEEDED(hr))
{
    /* ... */
   pMux->Release();
}

Обратите внимание, что некоторые фильтры невозможно создать с помощью CoCreateInstance. Это часто происходит с фильтрами, которые управляют другими компонентами программного обеспечения. Например, фильтр AVI Filter — это оболочка для видеокодеков, а фильтр захвата видео WDM — это оболочка для драйверов захвата WDM. Эти фильтры необходимо создавать с помощью перечислителя системных устройств или сопоставителя фильтров. Дополнительные сведения см. в разделе Перечисление устройств и фильтров.

Общие методы Graph-Building