Directshow 视频捕捉入门篇 二

原创 2014年01月24日 11:25:51

下面的代码来结束如何选择一个视频捕捉设备,就是我们平常说的摄像头

选择一个视频捕捉设备(Select capture device)

如何选择一个视频捕捉设备,可以采用系统设备枚举,详细资料参见Using the System Device Enumerator 。enumerator可以根据filter的种类返回一个设备的monikers。Moniker是一个com对象,可以参见IMoniker的SDK。


对于捕捉设备,下面两种类是相关的。


CLSID_AudioInputDeviceCategory 音频设备
CLSID_VideoInputDeviceCategory 视频设备

 


下面的代码演示了如何枚举一个视频捕捉设备

Cpp代码  收藏代码
  1. ICreateDevEnum *pDevEnum = NULL;  
  2. IEnumMoniker *pEnum = NULL;  
  3.   
  4. //Create the system device enumerator  
  5. HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,  
  6.                               CLSCT_INPROC_SERVER, IID_ICreateDevEnum,   
  7.                               reinterpret_cast<void**>(&pDevEnum));  
  8.   
  9. if(SUCCEEDED(hr))  
  10. {  
  11.     //创建一个枚举器,枚举视频设备  
  12.     hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,   
  13.                                         &pEnum, 0);  
  14. }  

 

IEnumMoniker接口pEnum返回一个IMoniker接口的列表,代表一系列的moniker,你可以显示所有的设备,然后让用户选择一个。
采用IMoniker::BindToStorage方法,返回一个IPropertyBag接口指针。然后调用IPropertyBag::Read读取moniker的属性。下面看看都包含什么属性:


1 FriendlyName 是设备的名字
2 Description 属性仅仅适用于DV和D-VHS/MPEG摄象机,如果这个属性可用,这个属性更详细的描述了设备的资料
3DevicePath 这个属性是不可读的,但是每个设备都有一个独一无二的。你可以用这个属性来区别同一个设备的不同实例


下面的代码演示了如何显示遍历设备的名称 ,接上面的代码

Cpp代码  收藏代码
  1. HWND hList;         //Handle to the list box  
  2. IMoniker *pMoniker = NULL;  
  3. while(pEnum->Next(1, &pMoniker, NULL) == S_OK)  
  4. {  
  5.     IPropertyBag *pPropBag;  
  6.     hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));  
  7.     if(FAILED(hr))  
  8.     {  
  9.         pMoniker->Release();  
  10.         continue;       //Skip this one, maybe the next one will work  
  11.     }  
  12.     VARIANT varName;  
  13.     hr = pPropBag->Read(L"Description", &varName, 0);  
  14.     if(FAILED(hr))  
  15.     {  
  16.         hr = pPropBag->Read(L"FriendlyName", &varName, 0);  
  17.     }  
  18.     if(SECCEEDED(hr))  
  19.     {  
  20.         //Add it to the application's list box  
  21.         USES_CONVERSION;  
  22.         (long)SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)OLE2T(varName.bstrVal));  
  23.         VariantClear(&varName);  
  24.     }  
  25.   
  26.     pPropBag->Release();  
  27.     pMoniker->Release();  
  28. }  

 

如果用户选中了一个设备调用IMoniker::BindToObject为设备生成filter,然后将filter加入到graph中。

Cpp代码  收藏代码
  1. IBaseFilter *pCap = NULL;  
  2. hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);  
  3. if(SECCEEDED(hr))  
  4. {  
  5.     hr = m_pGraph->AddFilter(pCap, L"Capture Filter");  
  6. }  

为了创建可以预览视频的graph,可以调用下面的代码:

Cpp代码  收藏代码
  1. ICaptureGraphBuilder2 *pBuild;      //Capture Graph Builder  
  2. //Initialize pBuild(not shown)  
  3. ...  
  4. IBaseFilter *pCap;                                  //Video capture filter  
  5. hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,  
  6.                                                 pCap, NULL, NULL);  


未完,待续。。。。。哈哈,如有问题可以联系我:QQ:1906733710,我是从事电子签到软件、电子白板、互动投影软件、查询软件开发的,现在要开发视频录制的功能,在对Directshow 研究的过程当中。希望一起研究提高。有需要软件的也可以联系我。

DirectSHOW中的视频捕捉 (乱七八糟整理)

DIRECTSHOW中的视频捕捉 -------------------------DirectSHOW 真不好玩............ 本篇文档主要描述关于用Directsho...
  • yulinxx
  • yulinxx
  • 2015年11月10日 11:12
  • 2595

DirectShow下视频显示窗口设置

显示视频 DirectShow 提供了如下过滤器来显示视频: l         Video Renderer 过滤器. 该过滤器可用于所有的支持DirectX的平台,它对平台没有其它特殊的要求。可...
  • CtiyMan
  • CtiyMan
  • 2015年09月11日 11:11
  • 1124

DirectShow编程实现摄像头视频捕捉

 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectSh...
  • shunde_cai
  • shunde_cai
  • 2006年12月25日 15:06
  • 1318

DIRECTSHOW中的视频捕捉

本篇文档主要描述关于用Directshow进行视频开发的一些技术 主要包括下面内容 1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(S...
  • wishfly
  • wishfly
  • 2016年01月06日 18:24
  • 736

音视频基础——DirectShow视频捕捉

参考: http://blog.csdn.net/yulinxx/article/details/49756399 http://blog.csdn.net/wangqiulin123456/art...
  • xuwei072
  • xuwei072
  • 2017年04月09日 14:35
  • 242

Directshow的视频捕捉

 Directshow(SDK)学习笔记九_视频捕捉摘要:本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容 1关于视频捕捉(About Video Capture in...
  • lan120576664
  • lan120576664
  • 2009年11月05日 09:38
  • 1302

Directshow中的视频捕捉

本篇文档主要描述关于用Directshow进行视频开发的一些技术主要包括下面内容 1关于视频捕捉(About Video Capture in Dshow) 2选择一个视频捕捉设备(Se...
  • benny5609
  • benny5609
  • 2008年03月03日 10:23
  • 2505

Python之路【第三篇】:Python基础(二)

内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件操作文件 一、打开文件 ? 1 文件句柄 = file('文件路径', '...
  • xiangxizhishi
  • xiangxizhishi
  • 2017年12月19日 11:14
  • 33

Directshow 视频捕捉 三

如何捕捉视频流并保存到文件(Capture video to File) 1 将视频流保存到AVI文件 AVI Mux filter接收从capture pin过来的视频流,然后将其打...
  • CreatedSign
  • CreatedSign
  • 2014年01月24日 11:38
  • 841

DirectShow视频捕捉应用研究

摘要 本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动(Driver)与应用的模型和接口进行研究和分析,比较其Windows与Windows CE中的不同,从而提出在Windows CE下实...
  • sayigood
  • sayigood
  • 2007年07月10日 09:02
  • 1576
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Directshow 视频捕捉入门篇 二
举报原因:
原因补充:

(最多只允许输入30个字)