其他分享
首页 > 其他分享> > c-在代码中没有在graphstudio中可用的引脚

c-在代码中没有在graphstudio中可用的引脚

作者:互联网

我正在使用网络摄像头的源过滤器.当我在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方法查找引脚:

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位问题.几乎没有别的了.彻底地逐步检查代码,添加调试输出将带您进入解决方案.

UPDATE.不能使用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,directshow
来源: https://codeday.me/bug/20191013/1908996.html