如何知道视频设备被其他进程占用? 在线等候

coldname 2004-04-13 03:30:55
capDriverConnect总弹出选择视频源的对话框,想去掉这个对话框?
或者用DirectShow,具体如何编程?
或者其他任何简易方法?
...全文
566 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
coldname 2004-04-14
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2900/2900925.xml?temp=.1222803
有一个解码方法,只是我不知道如何做。
其中说:设备的创建必须通过系统枚举。参见《DirectShow开发指南》P145页“5.7 系统设备的枚举”。

各位有没有清楚的?贴出源码来.
gothing 2004-04-14
  • 打赏
  • 举报
回复
不好意思,我自己的方法都没侧过,按deltacat(三角猫)的方法,首先可以简单地创建视频设备的filter和video renderer,然后尝试连接。
不知道还有没有其它更好的??
deltacat 2004-04-14
  • 打赏
  • 举报
回复
这个问题我遇到过,以上各位的方法都不好使,BindToObject、CoCreateInstance都不会检查设备是否被占用,即使被占用一样成功,它们只检查是否存在。

我当时处理的是一个视频设备,是在Render的时候检查。我的感觉是,在连接或是Run的时候,可以检查设备是否占用。这两个过程如果设备被占用,都是会返回失败的。
deltacat 2004-04-14
  • 打赏
  • 举报
回复
你可以看一下DXSDK的例子AMCAP。下面这段代码简单的展示了如何枚举设备。但是枚举设备也并不检查是否被占用。只有在实际使用的时候判断

// enumerate all video capture devices
ICreateDevEnum *pCreateDevEnum=0;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR)
{
ErrMsg(TEXT("Error Creating Device Enumerator"));
return;
}

IEnumMoniker *pEm=0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if(hr != NOERROR)
{
ErrMsg(TEXT("Sorry, you have no video capture hardware.\r\n\r\n")
TEXT("Video capture will not function properly."));
goto EnumAudio;
}

pEm->Reset();
ULONG cFetched;
IMoniker *pM;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
IPropertyBag *pBag=0;

hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(hr == NOERROR)
{
}
VariantClear(&var);
// Create Filter Instance
IBaseFilter *pFilter;
hr = pM->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
// You can add the filter to the graph
pBag->Release();
}
pM->Release();
}
pEm->Release();
deltacat 2004-04-14
  • 打赏
  • 举报
回复
你可以看一下DXSDK的例子AMCAP。下面这段代码简单的展示了如何枚举设备。但是枚举设备也并不检查是否被占用。只有在实际使用的时候判断

// enumerate all video capture devices
ICreateDevEnum *pCreateDevEnum=0;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR)
{
ErrMsg(TEXT("Error Creating Device Enumerator"));
return;
}

IEnumMoniker *pEm=0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if(hr != NOERROR)
{
ErrMsg(TEXT("Sorry, you have no video capture hardware.\r\n\r\n")
TEXT("Video capture will not function properly."));
goto EnumAudio;
}

pEm->Reset();
ULONG cFetched;
IMoniker *pM;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
IPropertyBag *pBag=0;

hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(hr == NOERROR)
{
}
VariantClear(&var);
// Create Filter Instance
IBaseFilter *pFilter;
hr = pM->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
// You can add the filter to the graph
pBag->Release();
}
pM->Release();
}
pEm->Release();
deltacat 2004-04-14
  • 打赏
  • 举报
回复
你可以看一下DXSDK的例子AMCAP。下面这段代码简单的展示了如何枚举设备。但是枚举设备也并不检查是否被占用。只有在实际使用的时候判断

// enumerate all video capture devices
ICreateDevEnum *pCreateDevEnum=0;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR)
{
ErrMsg(TEXT("Error Creating Device Enumerator"));
return;
}

IEnumMoniker *pEm=0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if(hr != NOERROR)
{
ErrMsg(TEXT("Sorry, you have no video capture hardware.\r\n\r\n")
TEXT("Video capture will not function properly."));
goto EnumAudio;
}

pEm->Reset();
ULONG cFetched;
IMoniker *pM;

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
IPropertyBag *pBag=0;

hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(hr == NOERROR)
{
}
VariantClear(&var);
// Create Filter Instance
IBaseFilter *pFilter;
hr = pM->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
// You can add the filter to the graph
pBag->Release();
}
pM->Release();
}
pEm->Release();
NoneSoVile 2004-04-13
  • 打赏
  • 举报
回复
我的建议是在DirectShow中,无论是device还是其他的filter一律通过CLSID建立,
具体方法:首先在graphEdit中获取设备的CLSID,没有CLSID的就自己定义,然后通过CoCreateInstance,如果返回零表示可以用,其他进程没有占用她
coldname 2004-04-13
  • 打赏
  • 举报
回复
BindToObject是返回成功的,即使其他进程正在使用这个设备?
coldname 2004-04-13
  • 打赏
  • 举报
回复
我的代码
CComPtr<IGraphBuilder> m_pGraph;
CComPtr <ICreateDevEnum> pCde=NULL;
CComPtr <IEnumMoniker> pEm=NULL;

HRESULT hr = S_OK;
//获得接口
hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &m_pGraph);
if (FAILED(hr))
return false;

hr=CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **) &pCde);
if (FAILED(hr))
return false;
pCde->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if(pEm==NULL)
return false;

CComPtr <IMoniker> pM=NULL;
ULONG cFetched;
CComPtr<IBaseFilter> pBf=NULL;
if(pEm->Next(1,&pM,&cFetched)==S_OK)
{
hr = pM->BindToObject(0,0,IID_IBaseFilter, (void**)&pBf);
if (SUCCEEDED(hr))
{
//将设备添加到graph
hr = m_pGraph->AddFilter(pBf, L"Capture Filter");
}
pM.Release();
}
else
{
return false;
}
coldname 2004-04-13
  • 打赏
  • 举报
回复
我测试时,不是这样的。
其他进程占用时,它一样返回成功.

????
gothing 2004-04-13
  • 打赏
  • 举报
回复
返回成功,就得到视频设备,没被其它进程占有;失败查看结果。
coldname 2004-04-13
  • 打赏
  • 举报
回复
然后呢?
gothing 2004-04-13
  • 打赏
  • 举报
回复
就用DirectShow,先通过枚举设备得到视频采集卡的moniker,然后使用IMoniker::BindToObject,得到IBaseFilter

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧