使用固定类别
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
若要在筛选器上搜索具有给定引脚类别的图钉,可以使用 ICaptureGraphBuilder2::FindPin 方法。 以下示例搜索视频预览图钉:
int i = 0;
hr = pBuild->FindPin(
pFilter, // Pointer to a filter to search.
PINDIR_OUTPUT, // Which pin direction?
&PIN_CATEGORY_PREVIEW, // Which category? (NULL means "any category")
&MEDIATYPE_Video, // What media type? (NULL means "any type")
FALSE, // Must be connected?
i, // Get the i'th matching pin (0 = first match)
&pPin // Receives a pointer to the pin.
);
第一个参数是指向筛选器的 IBaseFilter 接口的指针。 接下来的三个参数指定方向、引脚类别和媒体类型。 第五个参数中的值 FALSE 指示引脚可以连接或未连接。 (有关这些参数的确切定义,请参阅 method 的文档。) 如果该方法找到匹配的引脚,它将返回指向 pPin 参数中的 IPin 接口的指针。
虽然 FindPin 方法很方便,但你也可以根据需要编写自己的帮助程序函数。 若要确定固定的类别,请调用 IKsPropertySet::Get 方法,如 主题 Pin 属性集中所述。
以下代码显示了一个帮助程序函数,用于检查引脚是否与指定类别匹配:
// Returns TRUE if a pin matches the specified pin category.
BOOL PinMatchesCategory(IPin *pPin, REFGUID Category)
{
BOOL bFound = FALSE;
IKsPropertySet *pKs = NULL;
HRESULT hr = pPin->QueryInterface(IID_PPV_ARGS(&pKs));
if (SUCCEEDED(hr))
{
GUID PinCategory;
DWORD cbReturned;
hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0,
&PinCategory, sizeof(GUID), &cbReturned);
if (SUCCEEDED(hr) && (cbReturned == sizeof(GUID)))
{
bFound = (PinCategory == Category);
}
pKs->Release();
}
return bFound;
}
下一个示例是按类别搜索固定的函数,类似于 FindPin 方法:
// Finds the first pin that matches a specified pin category and direction.
HRESULT FindPinByCategory(
IBaseFilter *pFilter, // Pointer to the filter to search.
PIN_DIRECTION PinDir, // Direction of the pin.
REFGUID Category, // Pin category.
IPin **ppPin) // Receives a pointer to the pin.
{
*ppPin = 0;
HRESULT hr = S_OK;
BOOL bFound = FALSE;
IEnumPins *pEnum = 0;
IPin *pPin = 0;
hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
goto done;
}
while (hr = pEnum->Next(1, &pPin, 0), hr == S_OK)
{
PIN_DIRECTION ThisPinDir;
hr = pPin->QueryDirection(&ThisPinDir);
if (FAILED(hr))
{
goto done;
}
if ((ThisPinDir == PinDir) &&
PinMatchesCategory(pPin, Category))
{
*ppPin = pPin;
(*ppPin)->AddRef(); // The caller must release the interface.
bFound = TRUE;
break;
}
SafeRelease(&pPin);
}
done:
SafeRelease(&pPin);
SafeRelease(&pEnum);
if (SUCCEEDED(hr) && !bFound)
{
hr = E_FAIL;
}
return hr;
}
以下代码使用上一个函数在筛选器上搜索视频端口大头针:
IPin *pVP;
hr = FindPinByCategory(pFilter, PINDIR_OUTPUT,
PIN_CATEGORY_VIDEOPORT, &pVP);
if (SUCCEEDED(hr))
{
// Use pVP ...
// Release when you are done.
pVP->Release();
}
有关属性集的详细信息,请参阅 Windows 驱动程序工具包 (WDK) 文档。
相关主题