Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
[Funkce přidružená k této stránce DirectShow je starší funkce. Byla nahrazena MediaPlayer, IMFMediaEnginea Audio/Video Capture v rámci Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]
Kolíky podporují metodu IPin::EnumMediaTypes, která enumeruje preferované typy médií kolíku. Vrátí ukazatel na rozhraní IEnumMediaTypes. Metoda IEnumMediaTypes::Next načte ukazatele na struktury AM_MEDIA_TYPE popisující typy médií.
Enumerátor typu média existuje především kvůli tomu, aby Správce grafů filtru pomohl vytvořit inteligentní připojení a vaše aplikace ho pravděpodobně nebudou používat. Špendlík nemusí vracet žádné preferované typy médií. Typy médií, které vrací, můžou záviset na stavu připojení filtru. Výstupní špendlík filtru může například vrátit jinou sadu typů médií v závislosti na tom, který typ média byl nastaven pro vstupní špendlík filtru.
Následující příklad najde upřednostňovaný typ média, který odpovídá zadanému hlavnímu typu, podtypu nebo typu formátu.
// 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;
}
Poznámka
Tento příklad používá funkci SafeRelease k uvolnění ukazatelů rozhraní.
Související témata