MFC+DirectShow摄像头简单视频浏览
2008-08-19 10:10
288 查看
1 安装摄像头驱动
2 引用DirectShow库,包含DirectShow头文件
#pragma comment(lib,"Strmiids.lib")
#pragma comment(lib,"quartz.lib")
#include "dshow.h"
3 初始化com环境
::CoInitialize(NULL);
4 定义一个过滤器引脚查询函数,并实现之
定义
IPin *findpin(IBaseFilter *pFilter,PIN_DIRECTION dir);
实现,假定工程为MFC Dialog Based类型,主对话框类为VDlg
IPin *VDlg::findpin(IBaseFilter *pFilter,PIN_DIRECTION dir)
{
IEnumPins *pEnumPins=NULL;
IPin *pRetPin=NULL;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins);
while(pEnumPins->Next(1,&pRetPin,NULL)==S_OK)
{
pRectPin->QueryDirection(&pDir);
if(pDir==dir)
{
return pRetPin;
}
}
return 0;
}
5 预览实现
void VDlg::vPreview()
{
ICaptureGraphBuilder *pBuilder=NULL;
::CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void **)&pBuilder);
::CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
ICreateDevEnum *pDevEnum=NULL;
IEnumMoniker *pClsEnum=NULL;
::CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC,IID_ICreateDevEnum,(void **)&pDevEnum);
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClsEnum,0);
if(pClsEnum->Next(1,&pMoniker,NULL)==S_OK)
{
pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pSrc);
pMoniker->Release();
}
pClsEnum->Release();
pGraph->AddFilter(pSrc,L"AVI");
::CoCreateInstance(CLSID_VideoRenderer,NULL,CLSCTX_ALL,IID_IBaseFilter,(void **)&pPreview);
if(pPreview)
{
pGraph->AddFilter(pPreview,L"PREVIEW");
IPin *pPinOut,*pPinIn;
pPinOut=findpin(pSrc,PINDIR_OUTPUT);
pPinIn=findpin(pPreview,PINDIR_INPUT);
pGraph->ConnectDirect(pPinOut,pPinIn,0);
IVideoWindow *pWnd=NULL;
pPreview->QueryInterface(IID_IVideowindow,(void **)&pWnd);
if(pWnd)
{
long ws;
pWnd->put_Owner((long)m_hWnd);
pWnd->get_WindowStyle(&ws);
ws=ws &~ WS_CAPTION;
ws=ws &~WS_DLGFRAME;
ws=ws & WS_CHILD;
pWnd->put_WindowStyle(ws);
CRect rc;
this->GetClientRect(rc);
pWnd->put_Lef(5);
pWnd->put_Top(5);
pWnd->put_Width(rc.Width()-5);
pWnd->put_Height(rc.Height()-5);
}
pMediaCtrl->Run();
}
}
2 引用DirectShow库,包含DirectShow头文件
#pragma comment(lib,"Strmiids.lib")
#pragma comment(lib,"quartz.lib")
#include "dshow.h"
3 初始化com环境
::CoInitialize(NULL);
4 定义一个过滤器引脚查询函数,并实现之
定义
IPin *findpin(IBaseFilter *pFilter,PIN_DIRECTION dir);
实现,假定工程为MFC Dialog Based类型,主对话框类为VDlg
IPin *VDlg::findpin(IBaseFilter *pFilter,PIN_DIRECTION dir)
{
IEnumPins *pEnumPins=NULL;
IPin *pRetPin=NULL;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins);
while(pEnumPins->Next(1,&pRetPin,NULL)==S_OK)
{
pRectPin->QueryDirection(&pDir);
if(pDir==dir)
{
return pRetPin;
}
}
return 0;
}
5 预览实现
void VDlg::vPreview()
{
ICaptureGraphBuilder *pBuilder=NULL;
::CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void **)&pBuilder);
::CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph);
pBuilder->SetFiltergraph(pGraph);
ICreateDevEnum *pDevEnum=NULL;
IEnumMoniker *pClsEnum=NULL;
::CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC,IID_ICreateDevEnum,(void **)&pDevEnum);
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClsEnum,0);
if(pClsEnum->Next(1,&pMoniker,NULL)==S_OK)
{
pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pSrc);
pMoniker->Release();
}
pClsEnum->Release();
pGraph->AddFilter(pSrc,L"AVI");
::CoCreateInstance(CLSID_VideoRenderer,NULL,CLSCTX_ALL,IID_IBaseFilter,(void **)&pPreview);
if(pPreview)
{
pGraph->AddFilter(pPreview,L"PREVIEW");
IPin *pPinOut,*pPinIn;
pPinOut=findpin(pSrc,PINDIR_OUTPUT);
pPinIn=findpin(pPreview,PINDIR_INPUT);
pGraph->ConnectDirect(pPinOut,pPinIn,0);
IVideoWindow *pWnd=NULL;
pPreview->QueryInterface(IID_IVideowindow,(void **)&pWnd);
if(pWnd)
{
long ws;
pWnd->put_Owner((long)m_hWnd);
pWnd->get_WindowStyle(&ws);
ws=ws &~ WS_CAPTION;
ws=ws &~WS_DLGFRAME;
ws=ws & WS_CHILD;
pWnd->put_WindowStyle(ws);
CRect rc;
this->GetClientRect(rc);
pWnd->put_Lef(5);
pWnd->put_Top(5);
pWnd->put_Width(rc.Width()-5);
pWnd->put_Height(rc.Height()-5);
}
pMediaCtrl->Run();
}
}
相关文章推荐
- 简单的摄像头视频浏览和捕获程序
- 一个简单的摄像头视频浏览和捕获的程序
- 一个简单的摄像头视频浏览和捕获的程序(转载)
- 简单的摄像头视频浏览和捕获程序
- 一个简单的摄像头视频浏览和捕获的程序
- 简单的摄像头视频浏览和捕获程序
- OpenCV系列1-简单高效:MFC显示图片、播放视频
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- 利用opencv类库在MFC显示摄像头视频并且保存摄像头视频
- MFC视频教学第一课,做一个简单的界面,理解应用程序和操作系统之间的消息传递机制
- 树莓派简单摄像头录像并保存视频文件
- 使用DirectShow打开摄像头 MFC编程
- delphi 摄像头视频图像捕捉 不用directshow来实现 还有其它什么方法吗?
- opencv 、directshow捕获摄像头,实时播放,编码,保存视频,保存单帧
- 摄像头、视频采集和摄像设备图像质量判断的几种简单有效目测方法
- MFC窗口视频显示方法--OpenCV DirectShow模式
- IOS7-简单的调用本地摄像头采集视频
- 基于vfw的摄像头视频浏览和捕获的程序
- MFC中使用opencv获取海康摄像头视频
- MFC中如何利用ffmpeg和SDL2.0多线程多窗口播放摄像头的视频