我正在使用网络摄像头的源过滤器。当我在graphstudio中使用滤镜时,它有两个输出引脚。但是在代码中,对IEnumPins-> next的调用总是返回S_FALSE。 我还寻找了另一个可以创建引脚的接口,但是没有找到这样的东西。
如何在网络摄像头过滤器中添加引脚?如果它们在graphstudio中可用,它们也应该在代码中,对吧?
这是我的代码..我检查了返回值并返回它们,如果它们不正常。但是除了网络摄像头过滤器没有返回任何引脚外,一切似乎都能正常工作
CoInitialize(NULL);
IGraphBuilder* graphBuilder = NULL;
IMediaControl* mediaControl = NULL;
IMediaEvent* mediaEvent = NULL;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IFilterGraph, (void **)&graphBuilder);
HANDLE fileHandle = CreateFile(L"D:\\TEMP\\debug1.log", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
graphBuilder->SetLogFile((DWORD_PTR)fileHandle);
graphBuilder->QueryInterface(IID_IMediaControl, (void **)&mediaControl);
graphBuilder->QueryInterface(IID_IMediaEvent, (void **)&mediaEvent);
IBaseFilter* source = NULL;
static const GUID CLSID_Webcam =
{ 0x17CCA71B, 0xECD7, 0x11D0, { 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 } };
hr = CoCreateInstance(CLSID_Webcam, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&source);
if (FAILED(hr))
return hr;
hr = graphBuilder->AddFilter(source, L"logitech");
if (FAILED(hr))
return hr;
IPin* camOut = GetPin(source, PINDIR_OUTPUT);
...
GetPin函数使用EnumPins方法查找pin:
IPin *GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir)
{
BOOL bFound = FALSE;
IEnumPins *pEnum;
IPin *pPin;
pFilter->EnumPins(&pEnum);
while (pEnum->Next(1, &pPin, 0) == S_OK)
{
PIN_DIRECTION PinDirThis;
pPin->QueryDirection(&PinDirThis);
if (bFound = (PinDir == PinDirThis))
break;
pPin->Release();
}
pEnum->Release();
return (bFound ? pPin : 0);
}
另外,我不认为这是32/64位问题。我编译为x64,我也使用了64位版本的graphstudionext。我还确保网络摄像头过滤器的指示是正确的。 (至少如果你可以信任graphstudionext)
答案 0 :(得分:4)
这表示您的代码处理了另一个过滤器,否则会出现错误。你通常不会创造"引脚,特别是在视频设备支持的源过滤器上。典型的原因是:(a)您正在有效地创建不同的过滤器,(b)代码中的直接错误,(c)在两种环境中使用不同过滤器的32/64位问题。几乎没有别的东西。完全步进和检查代码,添加调试输出应该会带您进入解决方案。
更新。像这样的视频捕获设备无法使用CoCreateInstance
进行实例化。你必须使用标记创建它们。通常通过枚举,如MSDN(包含源代码段)中所述:Selecting a Capture Device。
以下代码不正确,仅供参考此GUID在SDK中声明为CLSID_Proxy
。
static const GUID CLSID_Webcam =
{ 0x17CCA71B, 0xECD7, 0x11D0, { 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 } };
hr = CoCreateInstance(CLSID_Webcam, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&source);