枚举媒体类型
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
图钉支持 IPin::EnumMediaTypes 方法,该方法枚举固定的首选媒体类型。 它返回指向 IEnumMediaTypes 接口的 指针。 IEnumMediaTypes::Next 方法检索指向描述媒体类型的AM_MEDIA_TYPE结构的指针。
媒体类型枚举器主要用于帮助 Filter Graph 管理器建立智能连接,应用程序可能不会使用它。 引脚不一定返回任何首选媒体类型。 此外,它返回的媒体类型可能取决于筛选器的连接状态。 例如,筛选器的输出引脚可能会返回一组不同的媒体类型,具体取决于为筛选器的输入引脚设置的媒体类型。
以下示例查找与指定的主要类型、子类型或格式类型匹配的首选媒体类型。
// 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 函数释放接口指针。
相关主题