共用方式為


DirectShow 篩選開發簡介

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine和媒體基金會中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

本節概述開發自定義 DirectShow 篩選器所涉及的工作。 它也提供更詳細討論這些工作的主題連結。 閱讀本節之前,請先閱讀 關於 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 基類的詳細資訊,請參閱下列主題:

創建 Pin

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

協商接腳連接

當濾鏡圖管理器嘗試連接兩個濾鏡時,連接點必須就各種事宜達成一致。 如果無法連線,連線嘗試就會失敗。 一般而言,設定會管理下列事項:

  • 運輸。 傳輸是過濾器用來將媒體樣本從輸出腳位移至輸入腳位的機制。 例如,他們可以使用 IMemInputPin 介面 (“push model”) 或 IAsyncReader 介面 (“pull model” )。
  • 媒體類型。 幾乎所有的接腳都會使用媒體類型來描述它們所傳遞的數據格式。
  • 分配器。 配置器是物件,會建立保存數據的緩衝區。 針腳需協定哪一個針腳將提供配置器。 它們也必須同意緩衝區的大小、要建立的緩衝區數目,以及其他緩衝區屬性。

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

處理和傳遞數據

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

  • 推送來源有一個工作執行緒,該執行緒會持續填充數據樣本,並將其傳遞到下游。
  • 提取來源會等候其下游芳鄰要求範例。 它會將資料寫入樣本,並將樣本傳遞至下游過濾器來回應。 下游過濾器會建立驅動數據流的執行緒。
  • 上游元件將範例傳送給轉換過濾器。 當它收到範例時,它會處理數據,並將其傳遞至下游。
  • 渲染篩選器會從上游接收樣本,並根據時間戳記排程進行渲染。

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

支援 COM

DirectShow 篩選條件是 COM 物件,通常封裝在 DLL 中。 基類庫會實作支援 COM 的架構。 如第 節和第節中 DirectShow 和 COM 所述。

撰寫 DirectShow 濾鏡