共用方式為


交涉媒體類型

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

當 Filter Graph 管理員呼叫 IPin::Connect 方法時,有數個選項可用來指定媒體類型:

  • 完整類型: 如果已完整指定媒體類型,則針腳會嘗試與該類型連線。 如果無法,連線嘗試就會失敗。
  • 部分媒體類型: 如果主要類型、子類型或格式類型GUID_Null,則媒體類型是 部分 的。 值GUID_Null做為「萬用字元」,表示任何值都是可接受的。 針腳會交涉與部分類型一致的類型。
  • 沒有媒體類型: 如果 Filter Graph 管理員傳遞 Null 指標,則針腳可以同意這兩個針腳可接受的任何媒體類型。

如果針腳確實連線,連線一律具有完整的媒體類型。 篩選圖形管理員所提供的媒體類型用途是限制可能的連線類型。

在交涉過程中,輸出釘選會藉由呼叫輸入針腳的 IPin::ReceiveConnection 方法來建議媒體類型。 輸入針腳可以接受或拒絕建議的類型。 此程式會重複執行,直到輸入針腳接受類型,或輸出針腳用完類型且連接失敗為止。

輸出釘選如何選取要建議的媒體類型,取決於實作。 在 DirectShow 基類中,輸出針腳會在輸入釘選上呼叫 IPin::EnumMediaTypes 。 這個方法會傳回列舉值,列舉輸入針腳的慣用媒體類型。 失敗,輸出針腳會列舉自己的慣用類型。

使用媒體類型

在任何接收AM_MEDIA_TYPE參數的函式中,一律在取值pbFormat成員之前先驗證cbFormatformattype的值。 下列程式碼不正確:

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

下列程式碼正確:

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}