共用方式為


DirectShow 篩選開發簡介

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

本節提供開發自訂 DirectShow 篩選器相關工作的簡短大綱。 它也提供更詳細討論這些工作的主題連結。 閱讀本節之前,請先閱讀 About DirectShow中的主題,以描述整體 DirectShow 架構。

DirectShow 基類庫

DirectShow SDK 包含一組用於撰寫篩選的 C++ 類別。 雖然不需要這些類別,但這些類別是撰寫新篩選的建議方式。 若要使用基類,請將它們編譯成靜態程式庫,並將 .lib 檔案連結至您的專案,如 建置 DirectShow 篩選中所述。

基類庫會定義篩選的根類別 CBaseFilter 類別。 數個其他類別衍生自 CBaseFilter,並針對特定類型的篩選特製化。 例如, CTransformFilter 類別是專為轉換篩選所設計。 若要建立新的篩選,請實作繼承自其中一個篩選類別的類別。 例如,您的類別宣告可能如下所示:

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

如需 DirectShow 基類的詳細資訊,請參閱下列主題:

建立針腳

篩選準則必須建立一或多個針腳。 針腳數目可以在設計階段修正,或者篩選準則可以視需要建立新的針腳。 釘選通常衍生自 CBasePin 類別,或繼承 CBasePin的類別,例如 CBaseInputPin。 篩選的針腳應該宣告為篩選類別中的成員變數。 某些篩選類別已經定義針腳,但如果您的篩選直接繼承自 CBaseFilter,您必須在衍生類別中宣告針腳。

交涉針腳連線

當 Filter Graph Manager 嘗試連接兩個篩選時,針腳必須同意各種專案。 如果無法,連線嘗試就會失敗。 一般而言,釘選會交涉下列專案:

  • 傳輸。 傳輸是篩選準則用來將媒體樣本從輸出釘選移至輸入針腳的機制。 例如,他們可以使用 IMemInputPin 介面 (「推送模型」) 或 IAsyncReader 介面 (「提取模型」) 。
  • 媒體類型。 幾乎所有針腳都會使用媒體類型來描述其所傳遞資料的格式。
  • 分配器。 配置器是物件,可建立保存資料的緩衝區。 針腳必須同意哪一個針腳會提供配置器。 它們也必須同意緩衝區的大小、要建立的緩衝區數目,以及其他緩衝區屬性。

基類會實作這些交涉的架構。 您必須藉由覆寫基類中的各種方法來完成詳細資料。 您必須覆寫的方法集取決於 類別和篩選的功能。 如需詳細資訊,請參閱 Filters Connect 的方式

處理和傳遞資料

大部分篩選的主要功能是處理和傳遞媒體資料。 發生的方式取決於篩選的類型:

  • 推送來源具有背景工作執行緒,其會持續填入資料樣本,並將其傳遞至下游。
  • 提取來源會等候其下游芳鄰要求範例。 它會將資料寫入範例,並將範例傳遞至下游篩選準則來回應。 下游篩選會建立驅動資料流程的執行緒。
  • 轉換篩選有由上游芳鄰傳遞給它的範例。 當它收到範例時,它會處理資料並將它傳遞給下游。
  • 轉譯器篩選會接收上游的樣本,並排程它們以時間戳記為基礎進行轉譯。

與串流相關的其他工作包括從圖形排清資料、處理資料流程結尾,以及回應搜尋要求。 如需這些問題的詳細資訊,請參閱下列主題:

支援 COM

DirectShow 篩選準則是 COM 物件,通常封裝在 DLL 中。 基類庫會實作支援 COM 的架構。 其描述于 DirectShow 和 COM一節。

撰寫 DirectShow 篩選