利用DirectShow列举系统已安装的摄像头设备

Directshow中的视频捕捉 本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(Select capture device) 3预览视频(Previewing Video) 4如何捕捉视频流并保存到文件(Capture video to File) 5将设备从系统中移走时的事件通知(Device r 阅读详情

原文地址:http://blog.sina.com.cn/s/blog_469ff3450102voy3.html


系统设备调查器提供了一个统一的方法去列举出系统中用户所有按类型注册的过滤器。系统设备调查器通过创建一个指定类型调查器(比如音频捕获类型或者视频压缩类型) (enumerator)来工作,这个调查器会返回系统中所有该类设备的唯一名称。

按一下步骤操作去使用设备调查器:

1. 调用CoCreateInstance 创建系统设备调查器。

类标识(CLSID)参数是CLSID_SystemDeviceEnum.

2. 调用ICreateDevEnum::CreateClassEnumerator 创建你想要的指定类型调查器,在类标识(CLSID)参数中指定你想要列举的设备类型。调用该方法后,将返回一个IenumMoniker指针。如果指定类型设备为空或者不存在该设备,将返回S_FALSE。同时IenumMoniker指针为NULL并且会造成一个异常。所有,在调用该方法的时候,要检查其返回值是否为S_OK,而不要使用SUCCEEDED宏去检测。

3. 使用 IEnumMoniker::Next 方法去列举出每个设备名称。该方法将返回一个Imoniker接口指针。当Next方法列举出最后一个设备名称后,它将返回S_FALSE,为S_OK表示还有设备没有列举完。

4. 调用IMoniker::BindToStorage 方法去获得设备的名称。

5. 调用IMoniker::BindToObject去创建并初始化DirectShow过滤器去管理选择的设备。调用IFilterGraph::AddFilter把创建的过滤器加到过滤器图表中。

下图显示处理流程

 

下面代码演示了列举出用户系统上安装的视频压缩设备。为了方便阅读,该例只加了最基本的错误检查。

// 创建系统设备调查器

HRESULT hr;

ICreateDevEnum *pSysDevEnum = NULL;

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,

IID_ICreateDevEnum, (void **)&pSysDevEnum);

if (FAILED(hr))

{

return hr;

}

 

// 获得视频压缩类型的制定类型调查器

IEnumMoniker *pEnumCat = NULL;

hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0);

 

if (hr == S_OK)

{

//列举所有设备

IMoniker *pMoniker = NULL;

ULONG cFetched;

while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)

{

IPropertyBag *pPropBag;

hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,

(void **)&pPropBag);

if (SUCCEEDED(hr))

{

// 获得设备名称

VARIANT varName;

VariantInit(&varName);

hr = pPropBag->Read(L"FriendlyName", &varName, 0);

if (SUCCEEDED(hr))

{

// 在你的程序中显示设备名称

}

VariantClear(&varName);

 

// 创建过滤器

IBaseFilter *pFilter;

hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,

(void**)&pFilter);

// 把过滤器加入到过滤器图表中

//记住在以后要释放掉pFilter指向的过滤器对象

pPropBag->Release();

}

pMoniker->Release();

}

pEnumCat->Release();

}

pSysDevEnum->Release();

 

设备 Monikers

IMoniker::GetDisplayName 方法将返回moniker的显示名称(display name)。对于设备monikers,你可以通过显示名称,使用IFilterGraph2::AddSourceFilterForMoniker方法为设备,创建一个捕获过滤器。

LPOLESTR strName = NULL;

IBaseFilter pSrc = NULL;

hr = pMoniker->GetDisplayName(NULL, NULL, &strName);

if (SUCCEEDED(hr))

{

// 为IFilterGraph2查找过滤器图表管理器

IFilterGraph2 *pFG2 = NULL;

hr = pGraph->QueryInterface(IID_IFilterGraph2, (void**)&pFG2);

if (SUCCEEDED(hr))

{

hr = pFG2->AddSourceFilterForMoniker(pMoniker, 0, L"Source", &pSrc);

pFG2->Release();

}

CoTaskMemFree(strName);

}

 

// 如果成功,要记住释放掉pSrc

 

虽然,设备显示名称便于阅读理解,你可能不会向用户显示该名称。而是用设备的Friendly名称显示给用户。

IMoniker::ParseDisplayName 方法和MkParseDisplayName函数可用于从获得的指定类型过滤器中创建一个默认的设备名称(moniker),它可以从类标识(GUID)中解析出显示名称(display name)。类标识表示方法为@device:*:{category-clsid}。默认的设备名称就是指定类型设备调查器中的第一个名称。

下面例子,创建视频捕获类设备的默认设备名称。

// 视频捕获类

WCHAR szMon[] = L"@device:*:{860BB310-5D01-11d0-BD3B-00A0C911CE86}";

IBindCtx *pBindCtx;

hr = CreateBindCtx(0, &pBindCtx);

 

ULONG chEaten = 0;

IMoniker *pMoniker = 0;

hr = MkParseDisplayName(pBindCtx, szMon, &chEaten, &pMoniker);

pBindCtx->Release();

if (SUCCEEDED(hr))

{

//获得显示名称(display name),或建立一个DirectShow 过滤器。

pMoniker->Release();

}


C#编程实现摄像头控制与媒体处理 在当今的信息化社会,图像采集和处理技术已成为众多软件应用不可或缺的一部分。C#作为一种功能强大的编程语言,搭配.NET框架,可以高效地控制和利用摄像头资源。本章将概述C#控制摄像头的基本概念,以及它在不同应用场合中的角色和作用,为读者揭示这一领域的工作原理和技术要点。首先,C#通过多种方式实现对摄像头的控制,这包括但不限于调用Windows API、利用DirectShow、使用Windows Media Foundation框架以及借助第三方库如AForge.NET。 阅读详情

相关推荐

AForge.Video.DirectShow: C#视频捕获与处理库深入解析

AForge.NET框架是一个开源的.NET框架,主要用于计算机视觉、图像处理和常规的机器学习任务。这个框架为开发者提供了一系列易于使用的工具和组件,使得在.NET环境下开发涉及图像处理和视觉算法的应用更加高效和简便。它不仅支持Windows平台,还可以在其他使用.NET运行时的平台上运行,例如Mono。AForge.NET框架背后的哲学是为用户提供一套全面的工具集,以减少图像处理和计算机视觉算法实现的复杂性。本章将从框架的起源、设计哲学和架构特点展开,为后续章节的详细介绍打下基础。

weixin_42576410的博客 1135

如何列举你系统已经安装的设备(视频压缩设备,视频捕获设备...)!

<!--google_ad_client = "pub-8303851053100251";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";google_ad_channel ="";//--><script

孙涛的专栏 6628

delphi7调用摄像头

该模块能够简单便捷的搜索并连接电脑的摄像头,能录制视频不卡顿并抓图,画面清晰;适用于delphi开发,使用简单,内置demo;非常简单可靠;

Windows下用DirectShow查找摄像头(含分辨率)和麦克风

        在视频聊天、视频会议、在线监控和视频展台等项目中,需要查找出本地电脑上连接的所有摄像头,网上流传比较多的方式是ffmpeg的方式,这种方式可以跨平台,不同的平台下调用不同的库。这种方式在控制台直接打印了摄像头的信息,无法(或者说我暂时没找到)在内存中获取,因此直接采用了DirectShow的方式,DirectShow枚举IMoniker和Ipin。因为网上的文...

qq_38883139的博客 5549

10.2 在新能源、储能及电网节点的应用实践

构网型变流器技术在电力系统中的应用进展 构网型变流器技术正从理论研究走向规模化工程应用,为新能源并网提供主动支撑能力。该技术在光伏电站采用"部分构网"混合架构,由构网单元实现黑启动和弱网稳定;在风电场利用叶轮动能提供惯量响应。储能系统是理想的构网载体,可提供快速调频和动态电压支撑。在电网节点,构网型STATCOM可增强弱电网电压稳定性,大容量变流器可替代传统调相机。当前面临标准滞后、宽频振荡风险等共性挑战,需在可靠性、经济性间取得平衡。系统级协调控制和精确阻抗建模是应用成功的关键。

技术工作者 1112

Mamba-ST实战:用状态空间模型实现艺术风格迁移的5个关键步骤

本文详细介绍了如何使用Mamba-ST状态空间模型实现高效的艺术风格迁移,涵盖环境配置、数据预处理、模型架构、训练策略和推理优化等5个关键步骤。Mamba-ST基于SSM(状态空间模型)构建,在保持生成质量的同时显著降低计算复杂度,为风格迁移领域提供了新的解决方案。

weixin_29163581的博客 355

DirectShow实践经验杂谈

1.当向Filter Graph中加入同一个Filter的多个实例时,使用Intelligent connect,优先使用最晚加入Filter Graph中的那个Filter实例。2.使用IGraphConfig接口可以将Filter加入Cache,以在Intelligentconnect时,提高该Filter的连接优先级。如果要加入Cache的Filter已在Graph中,确信它的所有P

peng6662001的专栏 1248

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 357

DirectShow 的重要接口

DirectShow 的重要接口   DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。下面就列举一些重要的DirectShow的接口。   (1) IGraphBuilder接口   用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。   (2) IMediaControl接口   用于控制多

心之所向,身之所往 1812

现代密码学5.3--Hash and MAC

现代密码学5.3--Hash and MAC 博主正在学习INTRODUCTION TO MODERN CRYPTOGRAPHY (Second Edition) --Jonathan Katz, Yehuda Lindell,做一些笔记供自己回忆,如有错误请指正。整理成一个系列现代密码学,方便检索。 第二章定义了完美安全及其对应的密码方案“一次一密”, 第三章介绍了多种安全定义 3.1-3.3 计算安全,PRG和基于PRG构造的满足计算安全的密码方案; 3.4-3.5 CPA安全,PRF和基于PRF构

qq_41545715的博客 686

YOLOv12创新改进 | 全网独家创新篇、小目标检测改进 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLOv12有效涨点

本文提出了HS-FPN(高频和空间感知特征金字塔网络),通过HFP(高频感知)模块增强小目标特征,SDP(空间依赖感知)模块捕获像素间空间依赖关系。实验在AI-TOD等小目标数据集上验证了该方法的有效性,相比FPN显著提升检测性能。文章详细介绍了HS-FPN的网络结构、核心代码实现及在YOLOv12中的应用方法,并提供多种改进版本的yaml配置文件,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 338

使用DirectShow驱动摄像头

对于小摄像头的驱动有几种方法,通过使用DirectShow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!  用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM格式的,当然,一些比较老的驱动格式DirectShow也可支持。DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层

李逸波(PMP) 1320

华为昇腾开发——多模型资源管理(C++)

在使用Ascend ACL(Ascend Computing Language)的ACLLite库进行多模型推理时,合理的资源管理至关重要。

如果想成为中心,那么就到中心去吧。 577

DirectShow 的常用接口

DirectShow 的重要接口 DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。下面就列举一些重要的DirectShow的接口。 (1) IGraphBuilder接口 用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。 (2) IMediaControl接口 用于控制多媒体流在过...

weixin_42452990的博客 1165

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5919

【机器学习-18】特征筛选:提升模型性能的关键步骤

我们将介绍不同类型的特征筛选方法,包括基于统计的方法、基于模型的方法和嵌入式方法等,并详细解释每种方法的原理和适用场景。通过特征筛选,我们可以减少数据集的维度,降低模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。通过选择适当的特征筛选方法,我们可以减少模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。然而,并非所有的特征都对模型的性能提升有所贡献,有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关的。我们的目标是通过特征筛选选择出对欺诈检测最有用的特征,以提高模型的预测精度。

qq_38614074的博客 1万+

用directshow 获取摄像头名称

CameraInfo.cpp          #include "CameraInfoDef.h" #include "CameraInfo.h"; const struct PixelFormatTag *avpriv_get_raw_pix_fmt_tags(void); enum AVPixelFormat avpriv_find_pix_fmt(const PixelF

xiongying789的博客 2054

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

FFmpeg采集摄像头视频和麦克风音频,并实现录制文件

之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度。最近发现很多人问怎么用FFmpeg采集摄像头图像,事实上FFmpeg很早就支持通过DShow获取采集设备(摄像头、麦克风)的数据了,只是网上提供的例子比较少。如果能用FFmpeg实现采集、编码和录制(或推流),那整个实现方案就简化很多,正因为这个原因,我想尝试做一个FFmpeg采集摄像头视频和麦克风音频的程序。经过一个星期的努力,终于做出来了。我打算把开发...

顺其自然~专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

用DirectShow实现视频采集-YYMeeting

用DirectShow实现视频采集 DirectShow作为DirectX的一个子集,它为用户提供了强大、方便的多媒体开接口,并且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序。这里结合实践中运用DirectShow实现视频采集(WIN32) 来加深对DirectShow的理解和操作能力。 1.系统环境及开发环境 a.系统支持Di...

语音视频技术专家 236

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

directshow 枚举机器所有摄像头!!

// ---------------------------------------------------------------------- // Our static function for finding num devices available etc // 摘自cap_dshow.cpp 文件 // ---------------------------------------...

杰克东的专栏 2960

directshow重要接口

<br />DirectShow 的重要接口<br /><br />   DirectShow采用了COM标准,所以很多重要的功能都是通过COM接口来完成。下面就列举 一些重要的DirectShow的接口。<br /><br />   (1) IGraphBuilder接口<br /><br />   用于构造Filter Graph的接口,建立和管理一系列的Filter,过滤和处理源媒体流。<br /><br />   (2) IMediaControl接口<br /><br />  

向往大海专栏 942
上一篇: Andriod基本框架
下一篇: Configure,Makefile.am, Makefile.in, Makefile文件之间关系
hepeiworks
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值