[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine以及 Microsoft Media Foundation 中的音訊/視訊擷取 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
插針支援 IPin::EnumMediaTypes 方法,此方法會列舉插針慣用的媒體類型。 它會傳回 IEnumMediaTypes 介面的指標。 IEnumMediaTypes::Next 方法會擷取描述媒體類型的 AM_MEDIA_TYPE 結構的指標。
媒體類型枚舉器主要目的是協助 Filter Graph Manager 建立智能連接,而您的應用程式可能不會使用它。 端點不一定會傳回任何偏好的媒體類型。 此外,傳回的媒體類型可能會取決於篩選的連線狀態。 例如,濾鏡的輸出接腳可能會根據濾鏡輸入接腳所設定的媒體類型,返回不同的媒體類型。
下列範例會尋找符合指定主要類型、子類型或格式類型的慣用媒體類型。
// Given a pin, find a preferred media type
//
// pPin Pointer to the pin.
// majorType Preferred major type (GUID_NULL = don't care).
// subType Preferred subtype (GUID_NULL = don't care).
// formatType Preferred format type (GUID_NULL = don't care).
// ppmt Receives a pointer to the media type. Can be NULL.
//
// Note: If you want to check whether a pin supports a desired media type,
// but do not need the format details, set ppmt to NULL.
//
// If ppmt is not NULL and the method succeeds, the caller must
// delete the media type, including the format block.
HRESULT GetPinMediaType(
IPin *pPin, // pointer to the pin
REFGUID majorType, // desired major type, or GUID_NULL = don't care
REFGUID subType, // desired subtype, or GUID_NULL = don't care
REFGUID formatType, // desired format type, of GUID_NULL = don't care
AM_MEDIA_TYPE **ppmt // Receives a pointer to the media type. (Can be NULL)
)
{
*ppmt = NULL;
IEnumMediaTypes *pEnum = NULL;
AM_MEDIA_TYPE *pmt = NULL;
BOOL bFound = FALSE;
HRESULT hr = pPin->EnumMediaTypes(&pEnum);
if (FAILED(hr))
{
return hr;
}
while (hr = pEnum->Next(1, &pmt, NULL), hr == S_OK)
{
if ((majorType == GUID_NULL) || (majorType == pmt->majortype))
{
if ((subType == GUID_NULL) || (subType == pmt->subtype))
{
if ((formatType == GUID_NULL) ||
(formatType == pmt->formattype))
{
// Found a match.
if (ppmt)
{
*ppmt = pmt; // Return it to the caller
}
else
{
_DeleteMediaType(pmt);
}
bFound = TRUE;
break;
}
}
}
_DeleteMediaType(pmt);
}
SafeRelease(&pEnum);
if (SUCCEEDED(hr))
{
if (!bFound)
{
hr = VFW_E_NOT_FOUND;
}
}
return hr;
}
注意
此範例會使用 SafeRelease 函式來釋放介面指標。
相關主題