gpt4 book ai didi

c++ - graphstudio 中可用的引脚在代码中不存在

转载 作者:行者123 更新时间:2023-11-30 01:53:59 25 4
gpt4 key购买 nike

我正在使用网络摄像头的源过滤器。当我在 graphstudio 中使用过滤器时,它有两个输出引脚。但是在代码中,对 IEnumPins->next 的调用总是返回 S_FALSE。我还寻找另一个可以创建引脚的接口(interface),但没有找到这样的东西。

enter image description here

如何将图钉添加到网络摄像头过滤器?如果它们在 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 方法查找引脚:

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。而且我还确保网络摄像头过滤器的 guid 是正确的。 (至少如果你可以信任 graphstudionext)

最佳答案

这表明您的代码处理另一个过滤器或存在错误。您通常不会“创建”引脚,尤其是在视频设备支持的源过滤器上。典型的原因是:(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);

关于c++ - graphstudio 中可用的引脚在代码中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22506451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com