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

coldname 2004-04-13 03:30:55
capDriverConnect总弹出选择视频源的对话框,想去掉这个对话框?
或者用DirectShow,具体如何编程?
或者其他任何简易方法?
...全文
636 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
内容概要:本研究针对微电网在遭受拒绝服务(DoS)攻击时面临的功率分配不均与电能质量问题,提出了一种兼顾功率精确均分与电压频率质量恢复的抗攻击混合动态事件触发二次控制策略。该策略通过设计新型混合动态事件触发机制,有效减少控制器与分布式单元间的网络通信负担,同时增强系统对DoS攻击的鲁棒性。研究构建了完整的微电网二次控制框架,整合了分布式协同控制算法与事件触发通信机制,在保证系统稳定性的同时,实现了对频率、电压偏差的快速调节和有功/无功功率的精确分配。通过Simulink平台进行仿真实验,验证了所提方法在遭受DoS攻击及正常运行工况下均能有效维持微电网的稳定运行与高质量电能输出。; 适合人群:具备电力系统自动化、分布式控制或微电网相关基础知识,从事新能源、智能电网领域研究的研发人员及高年级研究生。; 使用场景及目标:① 解决微电网在通信受限及网络攻击场景下的协同控制难题;② 实现微电网在异常工况下功率均分与电能质量的双重优化;③ 为设计高安全性、高可靠性的智能微电网控制系统提供理论依据与仿真验证方案。; 阅读建议:本资源侧重于控制策略的设计与仿真验证,建议读者结合微电网基础理论与Simulink仿真技术,深入理解事件触发机制与抗DoS攻击控制算法的实现细节,并动手复现仿真案例以加深对系统动态性能与鲁棒性的认识。
内容概要:本文围绕《【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)》展开,系统阐述了采用粒子群优化算法(PSO)对风能与水力发电系统进行联合优化调度的研究方法与技术路径。研究聚焦于构建多能源互补协调的优化模型,详细论述了目标函数的设计、系统约束条件的处理、算法求解流程及收敛性分析,并通过Matlab编程实现了完整的仿真验证过程,有效提升了可再生能源系统的运行效率与稳定性。该工作属于电力系统智能优化领域,强调对高水平期刊论文的高精度复现,兼具理论深度与工程实用性,适用于科研复现、学术研究与教学参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源优化调度、智能算法应用的工程技术人员。; 使用场景及目标:①用于复现《太阳能学报》等高水平期刊中关于风-水电联合调度的EI/SCI论文;②掌握粒子群算法在多源协同优化中的建模、编码与求解关键技术;③辅助完成学位论文、科研项目申报或学术竞赛中的仿真建模任务; 阅读建议:建议结合文中提供的网盘资源下载完整代码与文档资料,按照目录结构循序渐进学习,重点关注算法实现细节、电力系统建模逻辑与参数设置方法,同时可延伸学习灰狼优化算法、YALMIP工具包等先进优化技术,以全面提升科研仿真与创新能力。

2,554

社区成员

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

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