C++ AMCap中的多个卷筒纸凸轮
我在SDK中的direct show下构建了AMCap示例。它能够处理2个或更多的网络摄像头,我如何修改程序以便同时使用它们…比如按下一个显示“开始捕获”的按钮并确保所有摄像头开始捕获,以及一个显示“停止捕获”的按钮停止所有摄像头。我想从不同的相机帧被保存在不同的文件。我是新的C++,任何帮助都是值得赞赏的!谢谢你的时间 使用GraphEdit工具。在那里,您可以在连接所有视频输入设备的情况下构建自己的图形。请参见如果您刚开始使用DirectShow编程,这可能有点困难,但我希望它能给您一些帮助,或者为您指明正确的方向 M$DN有一个页面描述。示例有点少,所以我在下面提供了一个简单的实现 理论上,您需要枚举中的所有设备,并尝试为类别中的每个有效项创建渲染图 首先,我将向您展示迭代类别中设备名称的代码。下面是3个静态函数,可用于迭代类别中的设备。将这些功能添加到项目中后,可以通过调用以下功能列出“视频输入设备”类别中的设备:C++ AMCap中的多个卷筒纸凸轮,c++,sdk,directshow,C++,Sdk,Directshow,我在SDK中的direct show下构建了AMCap示例。它能够处理2个或更多的网络摄像头,我如何修改程序以便同时使用它们…比如按下一个显示“开始捕获”的按钮并确保所有摄像头开始捕获,以及一个显示“停止捕获”的按钮停止所有摄像头。我想从不同的相机帧被保存在不同的文件。我是新的C++,任何帮助都是值得赞赏的!谢谢你的时间 使用GraphEdit工具。在那里,您可以在连接所有视频输入设备的情况下构建自己的图形。请参见如果您刚开始使用DirectShow编程,这可能有点困难,但我希望它能给您一些帮助
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;
}