.hCursorLoadCursorNULLIDC_CROSSwndcls.hIconLoadIconNULLIDI_QUESTIONwndcls.hInstancehInstancewndcls.lpfnWndProcWindowProcwndcls.lpszClassNamequotCamCapturequotwndcls.lpszMenuNameNULLwndcls.styleCS_HREDRAW CS_VREDRAWifRegisterClassampwndcls MessageBoxNULLTEXTquotThis program requires WindowsNTquotszAppNameMB_ICONERROR return 0hwndCreateWindowquotCamCapturequotquotCamCapturequotWS_OVERLAPPEDWINDOW CW_USEDEFAULTCW_USEDEFAULT320240NULLNULLhInstanceNULLShowWindowhwndnCmdShowUpdateWindowhwndwhileGetMessageampmsgNULL00 TranslateMessageampmsg DispatchMessageampmsgreturn 0摘要:本文主要讲述用 Directshow 进行视频捕捉(捕捉静态图像)的编程思路,并提供针对摄像头编程的一个视频捕捉类 CcaptureVideo 和一个示例。
前言 DirectShow 是微软公司提供的一套在 Windows 平台上进行流媒体处理的开发包,与 DirectX 开发包一起发布。
DirectShow 为多媒体流的捕捉和回放提供了强有力的支持。
用 DirectShow 开发应用程序,我们可以很方便地从支持 WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。
DirectShow 是基于 COM 的,为了编写 DirectShow 应用程序,需要了解 COM客户程序编写的基础知识。
DirectShow 提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。
编程思路 为了更加容易建立视频捕捉应用程序,DirectShow 提供了一个叫做 CaptureGraph Builder 的对象,Capture Graph Builder 提供 IcaptureGraphBuilder2接口,该接口可以建立和控制 Capture Graph。
建立视频捕捉程序,必须首先获取并初始化 IcaptureGraphBuilder2 接口,然后选择一个适当的视频捕捉设备。
选择好设备后,为该设备创建 Capturefilter,然后调用 AddFilter 把 Capture filter 添加到 Filter Graph。
如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2::RenderStream 就可以了:ICaptureGraphBuilder2 pBuild // Capture Graph Builder//省略初始化部分代码IBaseFilter pCap // Video capture filter.//省略初始化和添加到 Filter Graph 部分代码pBuild-gtRenderStreamampPIN_CATEGORY_PREVIEW ampMEDIATYPE_Video pCapNULL NULL DirectShow 提供了一个捕捉静态图像的方法:使用 Sample Grabber filter。
依次按照以下三个步骤就可以了: 第一步 定义一个类实现 Sample Grabber 的回调接口 IsampleGrabberCB:class CSampleGrabberCB : public ISampleGrabberCB //在后面提供的类中具体完成CSampleGrabberCB mCB 第二步、调用 RenderStream 依次把 Still pin、Sample Grabber 和系统默认 Renderer Filter 连接起来。
第三步、配置 Sample Grabber 以捕获数据。
视频捕捉类 CCaptureVideo 的具体实现// CCaptureVideo 视频捕捉类头文件/////////////////////////////////////////////////////////////////////if definedAFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_defineAFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_/////////////////////////////////////////////////////////////////////// CaptureVideo.h : header file/////////////////////////////////////////////////////////////////////if _MSC_VER gt 1000pragma onceendif // _MSC_VER gt 1000include ltatlbase.hgtinclude ltwindows.hgtinclude ltdshow.hgtifndef SAFE_RELEASEdefine SAFE_RELEASE x if NULL x x-gtRelease x NULL endifclass CSampleGrabberCBclass CCaptureVideo : public CWnd friend class CSampleGrabberCB public: void GrabOneFrameBOOL bGrab HRESULT Initint iDeviceIDHWND hWnd int EnumDevicesHWND hList CCaptureVideo virtual CCaptureVideo private: HWND m_hWnd IGraphBuilder m_pGB ICaptureGraphBuilder2 m_pCapture IBaseFilter m_pBF IMediaControl m_pMC IVideoWindow m_pVW CComPtrltISampleGrabbergt m_pGrabber protected: void FreeMediaTypeAM_MEDIA_TYPEamp mt bool BindFilterint deviceId IBaseFilter pFilter void ResizeVideoWindow HRESULT SetupVideoWindow HRESULT InitCaptureGraphBuilderendif// definedAFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_//-------------------------------------------------------------------// CCaptureVideo 视频捕捉类实现文件 CaptureVideo.cpp//-------------------------------------------------------------------// CaptureVideo.cpp: implementation of the CCaptureVideo class.///////////////////////////////////////////////////////////////////////include quotstdafx.hquotinclude quotCaptureVideo.hquotifdef _DEBUGundef THIS_FILEstatic char THIS_FILE__FILE__define new DEBUG_NEWendifBOOL bOneShotFALSE//全局变量class CSampleGrabberCB : public ISampleGrabberCB public: long lWidth long lHeight TCHAR m_szFileNameMAX_PATH// 位图文件名称 CSampleGrabberCB strcpym_szFileName quotc:donaldo.bmpquot STDMETHODIMP_ULONG AddRef return 2 STDMETHODIMP_ULONG Release return 1 STDMETHODIMP QueryInterfaceREFIID riid void ppv if riid IID_ISampleGrabberCB riid IID_IUnknown ppv void static_castltISampleGrabberCBgt this return NOERROR return E_NOINTERFACE STDMETHODIMP SampleCB double SampleTime IMediaSample pSample return 0STDMETHODIMP BufferCB double dblSampleTime BYTE pBuffer longlBufferSize if bOneShot return 0 if pBufferreturn E_POINTER SaveBitmappBuffer lBufferSize bOneShot FALSE return 0//创建位图文件BOOL SaveBitmapBYTE pBuffer long lBufferSize HANDLE hf CreateFile m_szFileName GENERIC_WRITE FILE_SHARE_READ NULL CREATE_ALWAYS NULL NULL if hf INVALID_HANDLE_VALUE return 0 // 写文件头 BITMAPFILEHEADER bfh memset ampbfh 0 sizeof bfh bfh.bfType ’MB’ bfh.bfSize sizeof bfh lBufferSize sizeof BITMAPINFOHEADER bfh.bfOffBits sizeof BITMAPINFOHEADER sizeof BITMAPFILEHEADER DWORD dwWritten 0 WriteFile hf ampbfh sizeof bfh ampdwWritten NULL // 写位图格式 BITMAPINFOHEADER bih memset ampbih 0 sizeof bih bih.biSize sizeof bih bih.biWidth lWidth bih.biHeight lHeight bih.biPlanes 1 bih.biBitCount 24 WriteFile hf ampbih sizeof bih ampdwWritten NULL // 写位图数据 WriteFile hf pBuffer lBufferSize ampdwWritten NULL CloseHandle hf return 0 CSampleGrabberCB mCB//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CCaptureVideo::CCaptureVideo //COM Library Intialization ifFAILEDCoInitializeNULL / COINIT_APARTMENTTHREA
上一篇:
远程读写游戏内存VC带源码
下一篇:
网上购物系统毕业设计论文