共用方式為


宣告篩選資訊

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

第一個步驟是視需要宣告篩選資訊。 DirectShow 會定義下列結構來描述篩選、針腳和媒體類型:

結構 Description
AMOVIESETUP_FILTER 描述篩選。
AMOVIESETUP_PIN 描述針腳。
AMOVIESETUP_MEDIATYPE 描述媒體類型。

 

這些結構是巢狀結構。 AMOVEIESETUP_FILTER結構具有AMOVIESETUP_PIN結構的陣列指標,而且每個結構都有AMOVEIESETUP_MEDIATYPE結構的陣列指標。 這些結構會結合在一起,為 IFilterMapper2 介面提供足夠的資訊,以找出篩選準則。 它們不是篩選準則的完整描述。 例如,如果篩選準則建立同一個針腳的多個實例,您應該只宣告該針腳的一個 AMOVIESETUP_PIN 結構。 此外,不需要篩選,才能支援它註冊的每個媒體類型組合;也不需要註冊它支援的每個媒體類型。

將設定結構宣告為 DLL 內的全域變數。 下列範例顯示具有一個輸出針腳的篩選準則:

static const WCHAR g_wszName[] = L"Some Filter";

AMOVIESETUP_MEDIATYPE sudMediaTypes[] = {
    { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB24 },
    { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB32 },
};

AMOVIESETUP_PIN sudOutputPin = {
    L"",            // Obsolete, not used.
    FALSE,          // Is this pin rendered?
    TRUE,           // Is it an output pin?
    FALSE,          // Can the filter create zero instances?
    FALSE,          // Does the filter create multiple instances?
    &GUID_NULL,     // Obsolete.
    NULL,           // Obsolete.
    2,              // Number of media types.
    sudMediaTypes   // Pointer to media types.
};

AMOVIESETUP_FILTER sudFilterReg = {
    &CLSID_SomeFilter,      // Filter CLSID.
    g_wszName,              // Filter name.
    MERIT_NORMAL,           // Merit.
    1,                      // Number of pin types.
    &sudOutputPin           // Pointer to pin information.
};

篩選名稱會宣告為靜態全域變數,因為它將在其他地方再次使用。

如何註冊 DirectShow 篩選