【发布时间】:2013-03-22 23:22:34
【问题描述】:
我正在使用两个 DirectShow 图表,在不同的线程上运行,以显示流式视频(单独使用 VMR 9)并从两个网络摄像头捕获帧(使用 Sample Grabber)。其中一个是内置网络摄像头 (HP TrueVision HD),另一个是连接到 USB 端口的 Creative VF0520。其他 USB 端口均未使用。
问题是 Creative 相机打开(LED 亮起),但没有流通过。即使我禁用了内置网络摄像头,问题仍然存在。但是,如果在只有 Creative cam 连接的摄像头的桌面上运行,Creative cam 就可以工作。
该程序在每个摄像头都是唯一连接的情况下工作(Creative VF0520 在它是唯一连接到桌面的摄像头时工作),但是当连接两个摄像头时,视频显示和抓帧仅适用于内置在网络摄像头中。
我怀疑这个问题可能是由捕获过滤器的名字对象绑定引起的。我正在使用来自MSDN 的修改代码。这是绑定名字对象以捕获多个相机的过滤器的正确方法吗?
ULONG VideoPlayer::GetMonikers(IEnumMoniker *pEnum, std::vector<IMoniker *> *pListMonikers)
{
ULONG numRetrieved = 0;
IMoniker* pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, &numRetrieved) == S_OK)
{
// Bind to vector
pListMonikers->push_back(pMoniker);
IPropertyBag *pPropBag;
HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
if (FAILED(hr))
{
(*ppMoniker)->Release();
continue;
}
// Get information to display
pPropBag->Release();
}
return numRetrieved;
}
然后访问包含名字对象的向量以绑定到捕获过滤器:
hr = listMonikers[CAMERA_ID]->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pCap);
【问题讨论】:
标签: c++ camera directshow samplegrabber