交涉媒體類型
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
當 Filter Graph Manager 呼叫 IPin::Connect 方法時,它有數個選項可指定媒體類型:
- 完成類型: 如果完全指定媒體類型,釘選會嘗試與該類型連線。 如果無法連線,連線嘗試就會失敗。
- 部分媒體類型: 如果主要類型、子類型或格式類型GUID_NULL,媒體類型 部分。 值GUID_NULL做為「通配符」,表示任何值都可以接受。 針腳會交涉與部分類型一致的類型。
- 沒有媒體類型: 如果 Filter Graph Manager 傳遞 NULL 指標,則針腳可以同意這兩個針腳可接受的任何媒體類型。
如果針腳確實連線,連線一律具有完整的媒體類型。 Filter Graph Manager 所提供的媒體類型用途是限制可能的連線類型。
在交涉過程中,輸出接點會呼叫輸入針腳的 IPin::ReceiveConnection 方法來建議媒體類型。 輸入針腳可以接受或拒絕建議的類型。 此程式會重複執行,直到輸入針腳接受類型,或輸出針腳用盡類型且連線失敗為止。
輸出釘選如何選取要建議的媒體類型,取決於實作。 在 DirectShow 基類中,輸出釘選會在輸入釘選上呼叫 IPin::EnumMediaTypes。 這個方法會傳回列舉值,列舉輸入針腳的慣用媒體類型。 如果失敗,輸出針腳會列舉自己的慣用類型。
使用媒體類型
在任何接收 AM_MEDIA_TYPE 參數的函式中,在取 值 pbFormat 成員之前,一律先驗證 cbFormat 和 formattype 的值。 下列程式代碼不正確:
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.
}