C++ AMCap中的多个卷筒纸凸轮

C++ AMCap中的多个卷筒纸凸轮,c++,sdk,directshow,C++,Sdk,Directshow,我在SDK中的direct show下构建了AMCap示例。它能够处理2个或更多的网络摄像头,我如何修改程序以便同时使用它们…比如按下一个显示“开始捕获”的按钮并确保所有摄像头开始捕获,以及一个显示“停止捕获”的按钮停止所有摄像头。我想从不同的相机帧被保存在不同的文件。我是新的C++,任何帮助都是值得赞赏的!谢谢你的时间 使用GraphEdit工具。在那里,您可以在连接所有视频输入设备的情况下构建自己的图形。请参见如果您刚开始使用DirectShow编程,这可能有点困难,但我希望它能给您一些帮助

我在SDK中的direct show下构建了AMCap示例。它能够处理2个或更多的网络摄像头,我如何修改程序以便同时使用它们…比如按下一个显示“开始捕获”的按钮并确保所有摄像头开始捕获,以及一个显示“停止捕获”的按钮停止所有摄像头。我想从不同的相机帧被保存在不同的文件。我是新的C++,任何帮助都是值得赞赏的!谢谢你的时间

使用GraphEdit工具。在那里,您可以在连接所有视频输入设备的情况下构建自己的图形。请参见

如果您刚开始使用DirectShow编程,这可能有点困难,但我希望它能给您一些帮助,或者为您指明正确的方向

M$DN有一个页面描述。示例有点少,所以我在下面提供了一个简单的实现

理论上,您需要枚举中的所有设备,并尝试为类别中的每个有效项创建渲染图

首先,我将向您展示迭代类别中设备名称的代码。下面是3个静态函数,可用于迭代类别中的设备。将这些功能添加到项目中后,可以通过调用以下功能列出“视频输入设备”类别中的设备:

ListDevicesInCategory(CLSID_VideoInputDeviceCategory);
好的,这是三个函数。ListDevicesInCategory()是工作发生的地方。它取决于另外两个函数,FindDeviceInCategory()和countDeviceIncategory()

这是最后一个函数-GetFilter:

static IBaseFilter * GetFilter( REFCLSID clsidDeviceClass, CComBSTR & sName )
{   
    HRESULT             hr;
    IBaseFilter *       pRetFilter      = NULL;
    ICreateDevEnum *    pSysDevEnum     = NULL;
    IEnumMoniker *      pEnum           = NULL;
    IMoniker *          pMoniker        = NULL;
    int                 nSameSrcCounter = 0;

    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pSysDevEnum);

    if( pSysDevEnum )
        hr = pSysDevEnum->CreateClassEnumerator(clsidDeviceClass, &pEnum, 0);

    if (hr != S_OK) 
        return NULL;    

    USES_CONVERSION;


    while ( pEnum->Next(1, &pMoniker, NULL) == S_OK )
    {
        IPropertyBag *pPropBag = NULL;
        VARIANT var;
        VariantInit(&var);

        pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);

        hr = pPropBag->Read(L"FriendlyName", &var, 0);
        if (SUCCEEDED(hr))
        {
            if(sName == OLE2T(var.bstrVal))
            {           
                hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pRetFilter);
                if (FAILED(hr))                 
                    pRetFilter = NULL;                  

                VariantClear(&var); 
                pPropBag->Release();
                pMoniker->Release();
                break;
            }
        }

        VariantClear(&var); 
        pPropBag->Release();
        pMoniker->Release();
    }

    pSysDevEnum->Release();
    pEnum->Release();

    return pRetFilter;
}

GraphEdit是一个很好的创建图形的原型工具,但我认为OP希望在代码中实现这一点。GraphStudio是GraphEdit的更好替代品;)
CComPtr<IBaseFilter> spSource;
m_spSource.Attach(
                GetFilter(CLSID_VideoInputDeviceCategory, CComBSTR(L"Osprey-450e Video Device 1A"))
          );
static IBaseFilter * GetFilter( REFCLSID clsidDeviceClass, CComBSTR & sName )
{   
    HRESULT             hr;
    IBaseFilter *       pRetFilter      = NULL;
    ICreateDevEnum *    pSysDevEnum     = NULL;
    IEnumMoniker *      pEnum           = NULL;
    IMoniker *          pMoniker        = NULL;
    int                 nSameSrcCounter = 0;

    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pSysDevEnum);

    if( pSysDevEnum )
        hr = pSysDevEnum->CreateClassEnumerator(clsidDeviceClass, &pEnum, 0);

    if (hr != S_OK) 
        return NULL;    

    USES_CONVERSION;


    while ( pEnum->Next(1, &pMoniker, NULL) == S_OK )
    {
        IPropertyBag *pPropBag = NULL;
        VARIANT var;
        VariantInit(&var);

        pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);

        hr = pPropBag->Read(L"FriendlyName", &var, 0);
        if (SUCCEEDED(hr))
        {
            if(sName == OLE2T(var.bstrVal))
            {           
                hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pRetFilter);
                if (FAILED(hr))                 
                    pRetFilter = NULL;                  

                VariantClear(&var); 
                pPropBag->Release();
                pMoniker->Release();
                break;
            }
        }

        VariantClear(&var); 
        pPropBag->Release();
        pMoniker->Release();
    }

    pSysDevEnum->Release();
    pEnum->Release();

    return pRetFilter;
}