捕获筛选器的固定要求
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
本主题介绍在 DirectShow 捕获筛选器上实现输出引脚的要求。
固定名称
可以指定任何名称的固定。 如果引脚名称以波形符(~)字符开头,则当应用程序调用 IGraphBuilder::RenderFile时,Filter Graph 管理器不会自动呈现该图钉。 例如,如果筛选器具有捕获引脚和预览引脚,则可以分别将其命名为“~Capture”和“Preview”。 如果应用程序在图形中呈现该筛选器,预览图钉将连接到其默认呈现器,并且不会连接到捕获引脚,这是一种合理的默认行为。 这也适用于提供不应呈现的信息数据的引脚,或者需要设置自定义属性的固定。 请注意,具有波形符(~)前缀的引脚仍可由应用程序手动连接。
固定类别
捕获筛选器始终具有捕获引脚,并且可能具有预览引脚。 某些捕获筛选器可能具有其他输出引脚,以提供其他类型的数据,例如控制信息。 每个输出引脚都必须公开 IKsPropertySet 接口。 应用程序使用此接口来确定引脚类别。 引脚通常返回PIN_CATEGORY_CAPTURE或PIN_CATEGORY_PREVIEW。 有关详细信息,请参阅 Pin 属性集。
以下示例演示如何实现 IKsPropertySet 以返回捕获引脚上的引脚类别:
// Set: Cannot set any properties.
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
void *pInstanceData, DWORD cbInstanceData, void *pPropData,
DWORD cbPropData)
{
return E_NOTIMPL;
}
// Get: Return the pin category (our only property).
HRESULT CMyCapturePin::Get(
REFGUID guidPropSet, // Which property set.
DWORD dwPropID, // Which property in that set.
void *pInstanceData, // Instance data (ignore).
DWORD cbInstanceData, // Size of the instance data (ignore).
void *pPropData, // Buffer to receive the property data.
DWORD cbPropData, // Size of the buffer.
DWORD *pcbReturned // Return the size of the property.
)
{
if (guidPropSet != AMPROPSETID_Pin)
return E_PROP_SET_UNSUPPORTED;
if (dwPropID != AMPROPERTY_PIN_CATEGORY)
return E_PROP_ID_UNSUPPORTED;
if (pPropData == NULL && pcbReturned == NULL)
return E_POINTER;
if (pcbReturned)
*pcbReturned = sizeof(GUID);
if (pPropData == NULL) // Caller just wants to know the size.
return S_OK;
if (cbPropData < sizeof(GUID)) // The buffer is too small.
return E_UNEXPECTED;
*(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
return S_OK;
}
// QuerySupported: Query whether the pin supports the specified property.
HRESULT CMyCapturePin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID,
DWORD *pTypeSupport)
{
if (guidPropSet != AMPROPSETID_Pin)
return E_PROP_SET_UNSUPPORTED;
if (dwPropID != AMPROPERTY_PIN_CATEGORY)
return E_PROP_ID_UNSUPPORTED;
if (pTypeSupport)
// We support getting this property, but not setting it.
*pTypeSupport = KSPROPERTY_SUPPORT_GET;
return S_OK;
}
相关主题