




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
directshow实现视频捕获(源码)vs2005金钻传奇 我用visual studio 2005编了一个摄像头预览程序,还可以导出成avi文件,前提是要安装directshow,并搭建好环境,我安装的是directx 9.0b,搭建环境很简单,网上有很多,注意在项目-属性-配置属性-链接器-输入中要加上strmbasd.lib winmm.lib(中间有空格)。源代码如下:/*CaptureClass.h*/#pragma once#include #include #include #include /ISampleGrabber接口要求的 #ifndef SAFE_RELEASE#define SAFE_RELEASE(x) if (x) x-Release(); x = NULL; #endifclass CCaptureClasspublic:CCaptureClass(void);public:CCaptureClass(void);int EnumDevices(HWND hList); /void SaveGraph(TCHAR *wFileName); /保存滤波器链表void ConfigCameraPin(HWND hwndParent); /配置摄像头的视频格式void ConfigCameraFilter(HWND hwndParent); /配置摄像头的图像参数HRESULT CaptureImages(CString inFileName); /捕获保存视频HRESULT PreviewImages(int iDeviceID , HWND hWnd); /采集预览视频private:HWND m_hWnd; /视频显示窗口的句柄IGraphBuilder *m_pGB; /滤波器链表管理器ICaptureGraphBuilder2 *m_pCapture; /增强型捕获滤波器链表管理器IBaseFilter *m_pBF; /捕获滤波器IMediaControl *m_pMC; /媒体控制接口IVideoWindow *m_pVW; /视频显示窗口接口IBaseFilter *pMux; /写文件滤波器protected:bool BindFilter(int deviceId,IBaseFilter *pFilter); /把指定的设备滤波器捆绑到链表中void ResizeVideoWindow(); /更改视频显示窗口HRESULT SetupVideoWindow(); /设置视频显示窗口的特性HRESULT InitCaptureGraphBuilder(); /创建滤波器链表管理器,查询其各种控制接口;/*CaptureClass.cpp*/#include StdAfx.h#include CaptureClass.h/*/* 类构造函数实现 */*/CCaptureClass:CCaptureClass(void)CoInitialize(NULL); /COM库初始化m_hWnd = NULL; /视频显示窗口的句柄m_pVW = NULL ; /视频窗口接口指针清空m_pMC = NULL ; /媒体控制接口指针清空m_pGB = NULL ; /滤波器链表管理器接口指针清空m_pBF = NULL ; /捕获滤波器接口指针清空m_pCapture = NULL ; /增强型捕获滤波器链表管理器接口指针清空/*/* 析构函数 */*/CCaptureClass:CCaptureClass(void)if(m_pMC) m_pMC -Stop(); /首先停止媒体if(m_pVW) m_pVW-put_Visible(OAFALSE); /视频窗口不可见 m_pVW-put_Owner(NULL); /视频窗口的父窗口清空SAFE_RELEASE(m_pCapture); /释放增强型捕获滤波器链表管理器接口SAFE_RELEASE(m_pMC); /释放媒体控制接口SAFE_RELEASE(m_pGB); /释放滤波器链表管理器接口SAFE_RELEASE(m_pBF); /释放捕获滤波器接口CoUninitialize( ); /卸载COM库/*/* 把指定采集设备与滤波器捆绑 */*/bool CCaptureClass:BindFilter(int deviceId,IBaseFilter *pFilter)if( deviceId CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm,0);if( hr != NOERROR ) return false ;pEm-Reset(); /复位该设备ULONG cFetched;IMoniker *pM;int index = 0 ;/获取设备while( hr = pEm-Next(1,&pM,&cFetched),hr = S_OK , index BindToStorage(0,0,IID_IPropertyBag,(void*)&pBag); if(SUCCEEDED(hr) VARIANT var ; var.vt = VT_BSTR; /保存的是二进制的数据 hr = pBag-Read(LFriendlyName,&var,NULL); /获取FriendlyName形式的信息 if( hr = NOERROR ) /采集设备与捕获滤波器捆绑 if( index = deviceId ) pM-BindToObject(0,0,IID_IBaseFilter,(void*)pFilter); SysFreeString(var.bstrVal); /释放二进制数据资源,必须释放 pBag -Release(); pM-Release(); index+;return true ;/*/* 设置视频显示窗口的特性 */*/HRESULT CCaptureClass:SetupVideoWindow()HRESULT hr ;/m_hWnd为类CCaptureClass的成员变量,在使用该函数前须初始化hr = m_pVW-put_Visible(OAFALSE); /视频窗口不可见hr = m_pVW-put_Owner(OAHWND)m_hWnd); /窗口所有者:传入的窗口句柄if(FAILED(hr) return hr ;hr = m_pVW-put_WindowStyle( WS_CHILD | WS_CLIPCHILDREN); /窗口风格设置if( FAILED(hr) return hr ;ResizeVideoWindow(); /更改窗口大小hr = m_pVW-put_Visible(OATRUE); /视频窗口可见return hr ;/*/* 更改视频窗口大小 */*/void CCaptureClass:ResizeVideoWindow()if( m_pVW ) /让图像充满整个指定窗口 CRect rc ; :GetClientRect(m_hWnd,&rc); /获取显示窗口的客户区 m_pVW-SetWindowPosition(0,0,rc.right,rc.bottom); /设置视频显示窗口的位置/*/* 开始预览视频设备 */*/HRESULT CCaptureClass:PreviewImages(int iDeviceID , HWND hWnd)HRESULT hr ;/初始化视频捕获滤波器链表管理器hr = InitCaptureGraphBuilder();if(FAILED(hr) AfxMessageBox(_T(Failed to get video interfaces!); return hr ;/把指定采集设备与滤波器绑定if( !BindFilter(iDeviceID,&m_pBF) return S_FALSE;/把滤波器添加到滤波器链表中hr = m_pGB-AddFilter(m_pBF,LCapture Filter);/渲染媒体,把链表中的滤波器链接起来hr = m_pCapture-RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,m_pBF,NULL,NULL);if(FAILED(hr) AfxMessageBox(_T(Cant build the graph); return hr ;/设置视频显示窗口m_hWnd = hWnd; /初始化窗口句柄SetupVideoWindow(); /设置显示窗口hr = m_pMC-Run();if(FAILED(hr) AfxMessageBox(_T(Couldnt run the graph!); return hr ;return S_OK ;/*/* 设置捕获视频的文件,开始捕捉视频数据写文件 */*/HRESULT CCaptureClass:CaptureImages(CString inFileName)HRESULT hr = 0 ;m_pMC -Stop(); /先停止视频/设置文件名,注意第二个参数的类型hr = m_pCapture-SetOutputFileName(&MEDIASUBTYPE_Avi,inFileName.AllocSysString(),&pMux,NULL) ;/渲染媒体,链接所有滤波器hr = m_pCapture-RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,NULL,pMux);pMux-Release();m_pMC-Run(); /回复视频return hr ;int CCaptureClass:EnumDevices(HWND hList)if (!hList) return -1;int id = 0;/枚举视频扑捉设备ICreateDevEnum *pCreateDevEnum; /*此接口生成一个特殊类别的设备枚举器,The System Device Enumerator exposes this interface*/HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void*)&pCreateDevEnum);if (hr != NOERROR)return -1;IEnumMoniker *pEm=0; /此接口用来枚举一个名字组件或者枚举名字表中的名字hr = pCreateDevEnum-CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);/CreateClassEnumerator方法为指定的设备类生成一个类枚举器 if (hr != NOERROR)return -1;pEm-Reset(); /由于IEnumMoniker接口有一个标准的参考计数,pEm-Release(),一定要释放此接口ULONG cFetched;IMoniker *pM; /此接口包含允许你使用“名字”对象的方法,而名字对象包含能唯一确定COM对象的方法while(hr = pEm-Next(1, &pM, &cFetched), hr=S_OK) /返回枚举器队列中指定数目的条款,下“1”个 IPropertyBag *pBag; /接口IPropertyBag提供一个有属性包的对象,对象可以在包里存储它的特征 hr = pM-BindToStorage(0, 0, IID_IPropertyBag, (void *)&pBag); /返回包含被“moniker”确定的对象的存储位置的接口指针 if(SUCCEEDED(hr) VARIANT var; /VARIANT结构体包括很多类型 var.vt = VT_BSTR; /vt, describes which of the union members is valid,bstrVal是有效的 hr = pBag-Read(LFriendlyName, &var, NULL); /Asks the property bag to read the named /property into a caller-initialized VARIANT,var接收 if (hr = NOERROR) /CP_ACP:The current system Windows ANSI code page /var.bstrVal被转化的 /-1表示长度被自动计算;str表示转化侯接收目标的地方;两个NULL使函数更快 id+; /此函数处理指定的消息,hList窗口的句柄,此窗口处理此消息;CB_ADDSTRING要处理的消息 :SendMessage(hList, CB_ADDSTRING, 0,(LPARAM)var.bstrVal); SysFreeString(var.bstrVal); pBag-Release(); pM-Release();return id;HRESULT CCaptureClass:InitCaptureGraphBuilder()HRESULT hr ;/创建IGraphBuilder接口hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void*)&m_pGB);if(FAILED(hr) return hr ;/创建ICaptureGraphBuilder2接口hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void*)&m_pCapture) ;if(FAILED(hr) return hr ;/初始化滤波器链表管理器IGraphBuilderm_pCapture-SetFiltergraph(m_pGB);/查询媒体控制接口hr = m_pGB-QueryInterface(IID_IMediaControl,(void*)&m_pMC);if(FAILED(hr) return hr ;/查询视频窗口接口hr = m_pGB - QueryInterface(IID_IVideoWindow,(LPVOID*)&m_pVW);if(FAILED(hr) return hr ;return hr ;/配置摄像头数据源格式:分辨率、RGB/I420等void CCaptureClass:ConfigCameraPin(HWND hwndParent)HRESULT hr ; /返回值IAMStreamConfig *pSC ; /流配置接口ISpecifyPropertyPages *pSpec ; /属性页接口/只有停止后,才能进行引脚属性的设置m_pMC -Stop();/首先查询捕获CAPTURE、视频VIDEO接口hr = m_pCapture-FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,IID_IAMStreamConfig,(void*)&pSC);CAUUID cauuid ; /所有属性页结构体hr = pSC-QueryInterface(IID_ISpecifyPropertyPages,(void*)&pSpec);if( hr = S_OK ) hr = pSpec-GetPages(&cauuid); /获取所有属性页 /显示属性页 hr = OleCreatePropertyFrame(hwndParent,30,30,NULL,1,(IUnknown*)&pSC,cauuid.cElems,(GUID*)cauuid.pElems,0,0,NULL); /释放内存、资源 CoTaskMemFree(cauuid.pElems); pSpec-Release(); pSC-Release();/回复运行m_pMC-Run();/配置图像参数:亮度、色度、饱和度等void CCaptureClass:ConfigCameraFilter(HWND hwndParent)HRESULT hr = 0 ;ISpecifyPropertyPages *pProp ;hr = m_pBF-QueryInterface(IID_ISpecifyPropertyPages,(void*)&pProp);if(SUCCEEDED(hr) /获取滤波器名称和IUnknown接口指针 FILTER_INFO FilterInfo ; hr = m_pBF-QueryFilterInfo(&FilterInfo); IUnknown *pFilterUnk ; m_pBF-QueryInterface(IID_IUnknown,(void*)&pFilterUnk); /显示该页 CAUUID caGUID ; pProp -GetPages(&caGUID); OleCreatePropertyFrame( hwndParent, 0,0, FilterInfo.achName, 1, &pFilterUnk, caGUID.cElems, caGUID.pElems, 0, 0,NULL ); /释放内存、资源 CoTaskMemFree(caGUID.pElems); pFilterUnk-Release(); FilterInfo.pGraph -Release(); pProp-Release();m_pMC-Run();在dialog类中声明一个CaptureClass的对象m_cap:/*CaptureVideoDlg.h*/#pragma once#include afxwin.h#include CaptureClass.h/ CCaptureVideoDlg 对话框class CCaptureVideoDlg : public CDialog/ 构造public:CCaptureVideoDlg(CWnd* pParent = NULL); / 标准构造函数/ 对话框数据enum IDD = IDD_CAPTUREVIDEO_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected:HICON m_hIcon;/ 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:CStatic m_videoWindow;public:CComboBox m_listCtrl;CCaptureClass m_cap ;public:afx_msg void OnBnClickedPreview();public:afx_msg void OnBnClickedCapture();public:afx_msg void OnBnClickedVideoFormat();public:afx_msg void OnBnClickedImageParameter();public:afx_msg void OnBnClickedExit();/*CaptureVideoDlg.cpp*/#include stdafx.h#include CaptureVideo.h#include CaptureVideoDlg.hBOOL CCaptureVideoDlg:OnInitDialog()/ TODO: 在此添加额外的初始化代码m_cap.EnumDevices(m_listCtrl);/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年化妆品品牌推广经理营销能力考核试卷及答案解析
- 2025年家政服务专业初级考试技巧与预测题分析
- 2025年应急救灾无人机笔试高频题解宝典
- 2025年广播电视节目制作师技术水平测试试题及答案解析
- 2025年电子商务运营专员职业技能考核试题及答案解析
- 2025年水管员灌渠方向面试冲刺题
- 课件不准修改的原因
- 2025年工业机器人编程题集
- 机电提升运输安全知识培训课件
- 2025年农发行招聘笔试高频考点预测题
- GB/T 24218.1-2009纺织品非织造布试验方法第1部分:单位面积质量的测定
- 万东GFS型高频高压发生装置维修手册
- 公寓de全人物攻略本为个人爱好而制成如需转载注明信息
- 企业经营沙盘模拟实训指导书
- 汉密尔顿抑郁量表17项
- 《现代物流管理》第一章-导论(课用)
- 智能制造生产线运营与维护课件完整版
- 树木清障专项施工方案
- 内部审计-内部审计准则完整版-中国内部审计准则体系
- 《爱的教育》读书分享读书分享2
- 合伙经营教育培训机构合同经典版
评论
0/150
提交评论