DirectShow捕获视频并预览

#include <dshow.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"strmiids.lib")

void main() {
	IGraphBuilder *pGraph;//过滤器图表接口
	IMediaControl *pControl;//控制器接口
	IMediaEvent *pEvent;//事件接口
	ICaptureGraphBuilder2* pBuild;//构建捕获图和其他自定义过滤器图
	ICreateDevEnum *pEnum;//设备枚举器
	IEnumMoniker *ppEnumMoniker = NULL;
	IMoniker *pMoniker = NULL;

	HRESULT hr = CoInitialize(NULL);//初始化com库

	if (FAILED(hr)) {
		return;
	}
	
	hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,
		IID_IGraphBuilder,(void **)&pGraph);//创建过滤器图表管理器

	hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,
		IID_ICaptureGraphBuilder2, (void **)&pBuild);//创建捕获过滤器

	hr= CoCreateInstance(CLSID_SystemDeviceEnum,NULL,
		CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pEnum));//创建设备枚举过滤器
	//创建指定的设备类的枚举器。
	pEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &ppEnumMoniker, 0);

	IPropertyBag *pPropBag;//存储设备属性
	ppEnumMoniker->Next(1, &pMoniker, NULL);//检索枚举序列中指定数量的项目
	pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); //绑定到指定对象的存储
	
	VARIANT var;//存储设备信息变量
	VariantInit(&var);
	pPropBag->Read(L"FriendlyName", &var, 0);//读取设备名称
	cout << var.bstrVal << endl;

	IBaseFilter *pCap = NULL;//过滤器图控制器
	hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);//绑定到指定的对象
	if (SUCCEEDED(hr))
	{
		hr = pGraph->AddFilter(pCap, L"Capture Filter");//向图表添加捕获过滤器
	}

	pBuild->SetFiltergraph(pGraph);//指定要使用的捕获图构建器的过滤器图
	hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);//查询控制器接口
	hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);//查询时间接口

	pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
		pCap, NULL, NULL);//将源滤波器上的输出引脚连接到宿滤波器
	
	pControl->Run();//运行
	
	pControl->Release();
	pEvent->Release();
	pGraph->Release();
	//释放过滤器

	CoUninitialize();//卸载COM组件
	system("pause");
}

步骤

1.创建过滤器图,捕获过滤器,枚举设备过滤器

2.连接过滤器引脚

3.运行

猜你喜欢

转载自blog.csdn.net/u010019479/article/details/81517902