USB摄像头的interface class GUID Hi,大家猴年好!请问计算机中设备(如USB摄像头)的interface class GUID是什么概念呢?如何用程式或者注册表查询取得其interface class GUID?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从前做的一个通过USB视频采集 自己看看吧void TFormMain::CreatVideo(){ IEnumPins **ppEnum;//初始化,视频操作必须首先初始化 CoInitialize(NULL);//获得所有设备列表pDevEnum ICreateDevEnum *pDevEnum =NULL;//所有系统设备列表 hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **)&pDevEnum);//从所有设备中找到视频设备 IEnumMoniker *pClassEnum = NULL;//视频类设备列表 hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClassEnum, 0);//通过视频设备列表pClassEnum获得所有视频设备的Moniker,//并获得视频设备个数g_Total IMoniker *pMoniker=NULL;//用来查找视频的中间值 g_Total=0;//视频设备个数 if(pClassEnum==NULL) {//没有视频设备 ShowMessage("未安装视频设备"); pDevEnum->Release(); return; } IMoniker *g_pVideoMoniker[10]; while (hr = pClassEnum->Next(1, &pMoniker, &cFetched), hr == S_OK) { g_pVideoMoniker[g_Total] = pMoniker; g_Total++; } if(g_Total<2) { ShowMessage("只有一个摄像头"); pDevEnum->Release(); pClassEnum->Release(); g_pVideoMoniker[0]->Release(); g_pVideoMoniker[0] = NULL; return; }//将设备列表空间释放 pDevEnum->Release(); pClassEnum->Release();//将视频设备绑定到过滤器上 IBaseFilter *pSrc0 = NULL;//基础过滤器 IBaseFilter *pSrc1 = NULL;//基础过滤器 if(g_Total>1)//设备0 { hr = g_pVideoMoniker[0]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc0); hr = g_pVideoMoniker[1]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc1); g_pVideoMoniker[0]->Release(); g_pVideoMoniker[0] = NULL; g_pVideoMoniker[1]->Release(); g_pVideoMoniker[1] = NULL; } else if(g_Total==1) { hr = g_pVideoMoniker[0]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc0); ShowMessage("当前只安装了一个视频设备"); g_pVideoMoniker[0]->Release(); g_pVideoMoniker[0] = NULL; }//创建视频窗 g_pGraph0 = NULL;//过滤图 g_pGraph1 = NULL;//过滤图 hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) &g_pGraph0); hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) &g_pGraph1);//创建捕获窗 g_pCapture0 = NULL; g_pCapture1 = NULL; hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **) &g_pCapture0); hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **) &g_pCapture1);//视频窗的媒体控制参数 IVideoWindow * g_pVW0 = NULL; IMediaControl * g_pMC0 = NULL; IVideoWindow * g_pVW1 = NULL; IMediaControl * g_pMC1 = NULL; g_pGraph0->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC0); g_pGraph0->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW0); g_pGraph1->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC1); g_pGraph1->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW1);//将捕获窗的视频属性设为定义好的视频窗 g_pCapture0->SetFiltergraph(g_pGraph0); g_pCapture1->SetFiltergraph(g_pGraph1);//创建采样捕获过滤器 IBaseFilter *pF0 = NULL;//采样捕获过滤器 IBaseFilter *pF1 = NULL;//采样捕获过滤器 hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&pF0); hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&pF1); pGrab0 = NULL; pGrab1 = NULL; hr = pF0->QueryInterface( IID_ISampleGrabber, (void **)&pGrab0); hr = pF1->QueryInterface( IID_ISampleGrabber, (void **)&pGrab1); pF0->Release(); pF1->Release();//设定视频格式// AM_MEDIA_TYPE amt0;// AM_MEDIA_TYPE amt1; memset(&amt0,0, sizeof(AM_MEDIA_TYPE)); amt0.majortype = MEDIATYPE_Video; amt0.subtype = MEDIASUBTYPE_RGB24; amt0.formattype = FORMAT_VideoInfo; pGrab0 -> SetMediaType(&amt0); memset(&amt1, 0,sizeof(AM_MEDIA_TYPE)); amt1.majortype = MEDIATYPE_Video; amt1.subtype = MEDIASUBTYPE_RGB24; amt1.formattype = FORMAT_VideoInfo; pGrab1 -> SetMediaType(&amt1);//设定视频窗的视频格式 hr = g_pGraph0->AddFilter(pF0, L"Sample Grabber"); hr = g_pGraph1->AddFilter(pF1, L"Sample Grabber");// 将过滤器加到视频窗中. hr = g_pGraph0->AddFilter(pSrc0, L"Video Capture");if(g_Total>1) hr = g_pGraph1->AddFilter(pSrc1, L"Video Capture");// Render the preview pin on the video capture filter// 捕获窗与过滤器pSrc连接 hr = g_pCapture0->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrc0, NULL, NULL);if(g_Total>1) hr = g_pCapture1->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrc1, NULL, NULL); pSrc0->Release();//释放过滤器 pSrc0 = NULL;if(g_Total>1){ pSrc1->Release();//释放过滤器 pSrc1 = NULL;} g_pVW0->put_Owner((OAHWND)Panel2->Handle); g_pVW0->Release(); g_pVW0 = NULL; g_pVW1->put_Owner((OAHWND)Panel2->Handle); g_pVW1->Release(); g_pVW1 = NULL;//将视频显示到窗体上 //创建一个窗体/* g_hwnd0 = capCreateCaptureWindow ( (LPSTR) "My Capture Window0", // window name if pop-up WS_CHILD , // window style | WS_VISIBLE 200, 40, 280, 280, // window position and dimensions (HWND) Handle, 0 );//child ID g_hwnd1 = capCreateCaptureWindow ( (LPSTR) "My Capture Window1", // window name if pop-up WS_CHILD , // window style | WS_VISIBLE 600, 40, 280, 280, // window position and dimensions (HWND) Handle, 0 );//child ID //视频显示于该窗体 g_pVW0->put_Owner((OAHWND)g_hwnd0); g_pVW0->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS); g_pVW0->put_Height(280); g_pVW0->put_Width(280); g_pVW1->put_Owner((OAHWND)g_hwnd1); g_pVW1->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS); g_pVW1->put_Height(280); g_pVW1->put_Width(280); //获得创建窗体的大小,并将视频尺寸设定得与其一致 RECT grc; ::GetClientRect(g_hwnd0, &grc); g_pVW0->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom); ::GetClientRect(g_hwnd1, &grc); g_pVW1->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom);*/// 开始预览视频 hr = g_pMC0->Run(); hr = pGrab0->SetBufferSamples(TRUE); //设置采样缓存 hr = g_pMC1->Run(); hr = pGrab1->SetBufferSamples(TRUE); //设置采样缓存 g_pMC0->Release(); g_pMC1->Release();} Visual Studio 2010的MSDN是怎么回事? 简单问题请教 MFC与多线程编程问题 如何限制edit框输入长度,我限制了只有在点确定时才产生信息 如何在对话框中,为按钮添加一张图片->请进 进者有分(关于硬件控制和com) 高手请进。如何读出ORACLE(9i)中存入的二进制图形。(如果解决立即结帖,分不够再加) 为什么我的右键菜单位置不在我的鼠标旁边? 如何让ActiveX调用Internet上的文件? gethostname函数出了什么问题????????? 问 ado调用记录集某字段update问题 我要《COM本质论》的电子版,有的话200那去
从前做的一个通过USB视频采集 自己看看吧void TFormMain::CreatVideo()
{
IEnumPins **ppEnum;
//初始化,视频操作必须首先初始化
CoInitialize(NULL);
//获得所有设备列表pDevEnum
ICreateDevEnum *pDevEnum =NULL;//所有系统设备列表
hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **)&pDevEnum);
//从所有设备中找到视频设备
IEnumMoniker *pClassEnum = NULL;//视频类设备列表
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClassEnum, 0);
//通过视频设备列表pClassEnum获得所有视频设备的Moniker,
//并获得视频设备个数g_Total
IMoniker *pMoniker=NULL;//用来查找视频的中间值
g_Total=0;//视频设备个数
if(pClassEnum==NULL)
{//没有视频设备
ShowMessage("未安装视频设备");
pDevEnum->Release();
return;
}
IMoniker *g_pVideoMoniker[10];
while (hr = pClassEnum->Next(1, &pMoniker, &cFetched), hr == S_OK)
{
g_pVideoMoniker[g_Total] = pMoniker;
g_Total++;
}
if(g_Total<2)
{
ShowMessage("只有一个摄像头");
pDevEnum->Release();
pClassEnum->Release();
g_pVideoMoniker[0]->Release();
g_pVideoMoniker[0] = NULL;
return;
}
//将设备列表空间释放
pDevEnum->Release();
pClassEnum->Release();
//将视频设备绑定到过滤器上
IBaseFilter *pSrc0 = NULL;//基础过滤器
IBaseFilter *pSrc1 = NULL;//基础过滤器
if(g_Total>1)//设备0
{
hr = g_pVideoMoniker[0]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc0);
hr = g_pVideoMoniker[1]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc1);
g_pVideoMoniker[0]->Release();
g_pVideoMoniker[0] = NULL;
g_pVideoMoniker[1]->Release();
g_pVideoMoniker[1] = NULL;
}
else if(g_Total==1)
{
hr = g_pVideoMoniker[0]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc0);
ShowMessage("当前只安装了一个视频设备");
g_pVideoMoniker[0]->Release();
g_pVideoMoniker[0] = NULL;
}//创建视频窗
g_pGraph0 = NULL;//过滤图
g_pGraph1 = NULL;//过滤图
hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &g_pGraph0);
hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &g_pGraph1);
//创建捕获窗
g_pCapture0 = NULL;
g_pCapture1 = NULL;
hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &g_pCapture0);
hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &g_pCapture1);
//视频窗的媒体控制参数
IVideoWindow * g_pVW0 = NULL;
IMediaControl * g_pMC0 = NULL;
IVideoWindow * g_pVW1 = NULL;
IMediaControl * g_pMC1 = NULL; g_pGraph0->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC0);
g_pGraph0->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW0);
g_pGraph1->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC1);
g_pGraph1->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW1);
//将捕获窗的视频属性设为定义好的视频窗
g_pCapture0->SetFiltergraph(g_pGraph0);
g_pCapture1->SetFiltergraph(g_pGraph1);
//创建采样捕获过滤器
IBaseFilter *pF0 = NULL;//采样捕获过滤器
IBaseFilter *pF1 = NULL;//采样捕获过滤器
hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *)&pF0);
hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *)&pF1); pGrab0 = NULL;
pGrab1 = NULL; hr = pF0->QueryInterface( IID_ISampleGrabber, (void **)&pGrab0);
hr = pF1->QueryInterface( IID_ISampleGrabber, (void **)&pGrab1); pF0->Release();
pF1->Release();//设定视频格式
// AM_MEDIA_TYPE amt0;
// AM_MEDIA_TYPE amt1;
memset(&amt0,0, sizeof(AM_MEDIA_TYPE));
amt0.majortype = MEDIATYPE_Video;
amt0.subtype = MEDIASUBTYPE_RGB24;
amt0.formattype = FORMAT_VideoInfo;
pGrab0 -> SetMediaType(&amt0);
memset(&amt1, 0,sizeof(AM_MEDIA_TYPE));
amt1.majortype = MEDIATYPE_Video;
amt1.subtype = MEDIASUBTYPE_RGB24;
amt1.formattype = FORMAT_VideoInfo;
pGrab1 -> SetMediaType(&amt1);
//设定视频窗的视频格式
hr = g_pGraph0->AddFilter(pF0, L"Sample Grabber");
hr = g_pGraph1->AddFilter(pF1, L"Sample Grabber");
// 将过滤器加到视频窗中.
hr = g_pGraph0->AddFilter(pSrc0, L"Video Capture");
if(g_Total>1)
hr = g_pGraph1->AddFilter(pSrc1, L"Video Capture");
// Render the preview pin on the video capture filter
// 捕获窗与过滤器pSrc连接
hr = g_pCapture0->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pSrc0, NULL, NULL);
if(g_Total>1)
hr = g_pCapture1->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pSrc1, NULL, NULL); pSrc0->Release();//释放过滤器
pSrc0 = NULL;
if(g_Total>1)
{
pSrc1->Release();//释放过滤器
pSrc1 = NULL;
} g_pVW0->put_Owner((OAHWND)Panel2->Handle);
g_pVW0->Release();
g_pVW0 = NULL;
g_pVW1->put_Owner((OAHWND)Panel2->Handle);
g_pVW1->Release();
g_pVW1 = NULL;
//将视频显示到窗体上
//创建一个窗体
/*
g_hwnd0 = capCreateCaptureWindow (
(LPSTR) "My Capture Window0", // window name if pop-up
WS_CHILD , // window style | WS_VISIBLE
200, 40, 280, 280, // window position and dimensions
(HWND) Handle,
0 );//child ID
g_hwnd1 = capCreateCaptureWindow (
(LPSTR) "My Capture Window1", // window name if pop-up
WS_CHILD , // window style | WS_VISIBLE
600, 40, 280, 280, // window position and dimensions
(HWND) Handle,
0 );//child ID //视频显示于该窗体
g_pVW0->put_Owner((OAHWND)g_hwnd0);
g_pVW0->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
g_pVW0->put_Height(280);
g_pVW0->put_Width(280);
g_pVW1->put_Owner((OAHWND)g_hwnd1);
g_pVW1->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
g_pVW1->put_Height(280);
g_pVW1->put_Width(280); //获得创建窗体的大小,并将视频尺寸设定得与其一致
RECT grc;
::GetClientRect(g_hwnd0, &grc);
g_pVW0->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom);
::GetClientRect(g_hwnd1, &grc);
g_pVW1->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom);
*/
// 开始预览视频
hr = g_pMC0->Run();
hr = pGrab0->SetBufferSamples(TRUE); //设置采样缓存
hr = g_pMC1->Run();
hr = pGrab1->SetBufferSamples(TRUE); //设置采样缓存 g_pMC0->Release();
g_pMC1->Release();}