`
Riddick
  • 浏览: 632726 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

DirectShow中的视频捕捉之二

 
阅读更多

选择一个视频捕捉设备(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");
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics