选择一个视频捕捉设备(Select capture device)
如何选择一个视频捕捉设备,可以采用系统设备枚举,详细资料参见Using the System Device Enumerator 。enumerator可以根据filter的种类返回一个设备的monikers。Moniker是一个com对象,可以参见IMoniker的SDK。
对于捕捉设备,下面两种类是相关的。
CLSID_AudioInputDeviceCategory 音频设备
CLSID_VideoInputDeviceCategory 视频设备
下面的代码演示了如何枚举一个视频捕捉设备
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
//Create the system device enumerator
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCT_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast<void**>(&pDevEnum));
if(SUCCEEDED(hr))
{
//创建一个枚举器,枚举视频设备
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEnum, 0);
}
IEnumMoniker接口pEnum返回一个IMoniker接口的列表,代表一系列的moniker,你可以显示所有的设备,然后让用户选择一个。
采用IMoniker::BindToStorage方法,返回一个IPropertyBag接口指针。然后调用IPropertyBag::Read读取moniker的属性。下面看看都包含什么属性:
1 FriendlyName 是设备的名字
2 Description 属性仅仅适用于DV和D-VHS/MPEG摄象机,如果这个属性可用,这个属性更详细的描述了设备的资料
3DevicePath 这个属性是不可读的,但是每个设备都有一个独一无二的。你可以用这个属性来区别同一个设备的不同实例
下面的代码演示了如何显示遍历设备的名称 ,接上面的代码
HWND hList; //Handle to the list box
IMoniker *pMoniker = NULL;
while(pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));
if(FAILED(hr))
{
pMoniker->Release();
continue; //Skip this one, maybe the next one will work
}
VARIANT varName;
hr = pPropBag->Read(L"Description", &varName, 0);
if(FAILED(hr))
{
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
}
if(SECCEEDED(hr))
{
//Add it to the application's list box
USES_CONVERSION;
(long)SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)OLE2T(varName.bstrVal));
VariantClear(&varName);
}
pPropBag->Release();
pMoniker->Release();
}
如果用户选中了一个设备调用IMoniker::BindToObject为设备生成filter,然后将filter加入到graph中。
IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if(SECCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}
分享到:
相关推荐
基于MFC、VS2010、directshow摄像头视频捕捉
基于directshow的视频捕捉入门程序,
c# directx 视频捕捉源码,在 visual studio 2008 上测试通过
VC.NET做的基于DirectShow的视频捕捉程序,由于电脑是日文的,所以一些注释是日文的
通过directshow实现对摄像头画面的捕捉,以及对系统声音的捕捉,可以实时得到数据流
DirectShow视频捕捉应用研究 本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动(Driver)与应用的模型和接口进行研究和分析,比较其Windows与Windows CE中的不同,从而提出在Windows CE下实现视频捕捉...
基于DirectShow的视频捕获
利用 DirectShow 技术实时捕捉视频流中的图像帧(在 JSP 中实现动态图表方法研究 李伯宇 , 赵丽丽 ( 西安理工大学 计算机科学与工程学院 , 陕西 西安 710048))
基于VC和DirectShow技术的视频采集和捕捉,供初学者学习研究。
利用DirectShow技术实时捕捉视频流中的图像帧
c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉c#视频捕捉
从网上下下来经过修改后可以完全正确执行的系统。是基于VC的,要运行还要下载相关的directshow的组件。
一个集视频捕捉和视频播放在一起的DIRECTSHOW程序SimplePlayer
主要介绍了如何编写C++程序来使DirectShow进行视频捕捉的方法,DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,要的朋友可以参考下
视频作为信息的重要载体之一,已经逐步深入到人们的 日常生活和娱乐,这标志着视频技术是一个充满生机 发展 迅速的领域
基于VC、DirectShow和OpenCV的摄像头捕捉视频的例子,不需要安装DirectX SDK
基于VC和DirectShow技术的视频采集和捕捉 直接使用VS打开即可使用 包含strmbasd.lib,把strmbasd.lib和strmbas.lib放到项目目录下就可以运行了
本文主要讲述用Directshow进行视频捕捉(捕捉静态图像)的编程思路,并提供针对摄像头编程的一个视频捕捉类CcaptureVideo和一个示例。