步驟 3: 支援媒體類型交涉

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

這是 撰寫轉換篩選器教學課程的步驟 3。

當兩個針腳連接時,它們必須同意連線的媒體類型。 媒體類型描述資料的格式。 如果沒有媒體類型,篩選準則可能會傳遞一種資料,而只會讓另一個篩選將它視為其他專案。

交涉媒體類型的基本機制是 IPin::ReceiveConnection 方法。 輸出針腳會在輸入針腳上呼叫具有建議媒體類型的這個方法。 輸入針腳會接受連線或拒絕它。 如果拒絕連線,輸出釘選可以嘗試其他媒體類型。 如果找不到適合的類型,連線就會失敗。 或者,輸入針腳可以透過 IPin::EnumMediaTypes 方法來公告偏好的類型清單。 輸出釘選可以在建議媒體類型時使用此清單,但不需要。

CTransformFilter類別會實作此程式的一般架構,如下所示:

  • 輸入針腳沒有慣用的媒體類型。 它完全依賴上游篩選來建議媒體類型。 對於視訊資料,這很合理,因為媒體類型包含影像大小和畫面播放速率。 一般而言,該資訊必須由上游來源篩選或剖析器篩選準則提供。 在音訊資料的情況下,可能的格式集較小,因此輸入針腳可能會提供一些慣用的類型。 在此情況下,請在輸入釘選上覆寫 CBasePin::GetMediaType
  • 當上游篩選建議媒體類型時,輸入針腳會呼叫 CTransformFilter::CheckInputType 方法,以接受或拒絕類型。
  • 除非先連接輸入針腳,否則輸出針腳不會連接。 此行為通常是轉換篩選準則。 在大部分情況下,篩選準則必須先判斷輸入類型,才能設定輸出類型。
  • 當輸出釘選確實連線時,其具有建議給下游篩選的媒體類型清單。 它會呼叫 CTransformFilter::GetMediaType 方法來產生此清單。 輸出針腳也會嘗試下游篩選所建議的任何媒體類型。
  • 若要檢查特定輸出類型是否與輸入類型相容,輸出針腳會呼叫 CTransformFilter::CheckTransform 方法。

先前列出的三個 CTransformFilter 方法是純虛擬方法,因此衍生類別必須實作它們。 這些方法都不屬於 COM 介面;它們只是基類所提供實作的一部分。

下列各節將更詳細地描述每個方法:

篩選連線的方式

撰寫 DirectShow 篩選