选择一个视频捕捉设备(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");
}
分享到:
相关推荐
在这个"基于DirectShow的视频捕捉入门程序"中,我们将探讨如何使用DirectShow库来构建一个简单的视频捕获应用。 首先,DirectShow主要由一系列过滤器构成,这些过滤器分为两类:源过滤器和转换过滤器。源过滤器用于...
文章还提供了一个名为`CCaptureVideo`的视频捕捉类的示例,它是C++ MFC中的一个窗口类,用于封装DirectShow视频捕获的相关操作。`CCaptureVideo`类包含了初始化、开始捕获、停止捕获以及释放资源等方法,使得开发者...
C# DirectShow视频捕捉源码是一个利用DirectX库在C#环境下实现的视频捕获应用,可以在Visual Studio 2008这样的开发环境中运行。这个源码可以帮助开发者理解和学习如何在Windows平台上构建自己的视频采集应用程序。 ...
### 利用DirectShow技术实时捕捉视频流中的图像帧 #### 背景与意义 随着信息技术的发展,视频已经成为信息传播的重要载体之一。对于视频流的实时分析与处理成为研究的热点,特别是在视频分析领域中,如镜头分割、...
DirectShow是一种由微软开发的多媒体框架,用于在Windows操作系统上处理音视频流。它提供了丰富的API接口,使得开发者能够...通过研究"C Camera Sample"源代码,可以进一步提升对DirectShow视频捕捉的理解和应用能力。
在这个"directshow视频捕捉系统"中,你可能找到以下几个关键知识点: 1. **DirectShow SDK**:这是开发DirectShow应用的基础,包含了头文件、库文件和示例代码,帮助开发者理解和使用DirectShow API。 2. **Filter...
在这个“DirectShow视频音频捕捉”的项目中,我们将深入探讨如何利用DirectShow来实现摄像头画面的捕获以及系统声音的捕获。 首先,`CaptionVideo.vcxproj`和`.vcxproj.user`是Visual Studio的项目文件,用于定义...
"利用 DirectShow 技术实时捕捉视频流中的图像帧" DirectShow 是一项强大的多媒体技术,提供了实时捕捉视频流中的图像帧的方法。该技术基于 COM 组件模型,规定了一组接口的多媒体应用框架,通过创建一系列由 ...
#### 五、DirectShow视频捕获实现 在DirectShow中实现视频捕获主要涉及以下步骤: 1. **初始化**:创建过滤器图表管理器对象。 2. **添加过滤器**:将源过滤器(如视频捕获设备)和渲染过滤器添加到过滤器图表中。...
本资源“基于VC和DirectShow技术的视频采集和捕捉.rar”显然是一个面向初学者的学习资料,旨在教授如何利用Visual C++(VC)与DirectShow进行视频采集和捕捉。 首先,我们要理解DirectShow的基本结构。它由一系列的...
DirectShow视频捕捉应用研究 本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动(Driver)与应用的模型和接口进行研究和分析,比较其Windows与Windows CE中的不同,从而提出在Windows CE下实现视频捕捉...
10. **代码示例**:在实际项目中,学习和参考已有的C# DirectShow视频捕获代码示例可以帮助快速上手。例如,`DxTuner`可能是一个包含此类示例的资源。 总的来说,"C#视频捕捉 DirectShow"涉及到多媒体处理的多个...
### 利用DirectShow技术实时捕捉视频流中的图像帧 #### 一、背景与意义 随着信息技术的发展,视频已经成为人们日常生活中不可或缺的一部分。无论是在线学习、远程办公还是娱乐休闲,视频都发挥着至关重要的作用。...
在本文中,我们将深入探讨如何使用DirectShow在Visual Studio 2013环境下实现视频的实时显示,并进行抓图功能,同时允许用户自定义图像参数和视频格式。 首先,要进行DirectShow编程,你需要在你的开发环境中安装...
视频捕捉的关键在于Sample Grabber Filter。这个Filter允许开发者自定义数据处理回调函数,当新的视频帧到达时,该函数会被调用。通过分析和处理回调中的数据,你可以进行各种操作,比如显示预览、实时处理或存储...
在C++中利用DirectShow进行视频捕捉涉及到一系列的步骤和技术,DirectShow是微软提供的一套强大的多媒体处理框架,它建立在ActiveMovie和Video for Windows之上,以COM组件模型为基础,支持实时流媒体处理,包括视频...
DirectShow主要应用于Windows平台,它构建在COM(组件对象模型)之上,提供了丰富的API接口,能够实现高质量的媒体播放、视频捕获、视频编码和解码等多种功能。在视频预览和捕获方面,DirectShow提供了一整套的类和...
在本项目中,"SimplePlayer"是一个结合了视频捕捉和播放功能的程序,它是基于DirectShow技术实现的。 视频捕捉是指从摄像头或其他视频输入设备实时获取视频数据的过程。在DirectShow中,视频捕捉通常涉及到以下几个...