#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.运行