DirectShow编程实现摄像头视频捕捉.doc
《DirectShow编程实现摄像头视频捕捉.doc》由会员分享,可在线阅读,更多相关《DirectShow编程实现摄像头视频捕捉.doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、DirectShow编程实现摄像头视频捕捉前言DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。 DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。Directshow提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便
2、了。编程思路# W+ K9 7 M( u z5 U2 P2 g为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。选择好设备后,为该设备创建Capture filter,然后调用AddFilter把Capture filter添加到Filter Graph。如果仅仅希望用摄
3、像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2:RenderStream就可以了:ICaptureGraphBuilder2 *pBuild; / Capture Graph Builder$ N/ |3 v% Z- R. E# m/省略初始化部分代码IBaseFilter *pCap; / Video capture filter.: p# y! D s; # v+ Q/省略初始化和添加到Filter Graph部分代码pBuild-RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap
4、, NULL, NULL);DirectShow提供了一个捕捉静态图像的方法:使用Sample Grabber filter。依次按照以下三个步骤就可以了:: g; ?) m: X& : L# v第一步, 定义一个类实现Sample Grabber的回调接口IsampleGrabberCB:: V& u w. G5 x n: Nclass CSampleGrabberCB : public ISampleGrabberCB k* a$ K2 s+ y R5 c O1 /在后面提供的类中具体完成CSampleGrabberCB mCB;第二步、调用RenderStream依次把Still pin
5、、Sample Grabber和系统默认Renderer Filter连接起来。! N Q7 c/ O5 g/ ?, c p第三步、配置Sample Grabber以捕获数据。0 U3 a3 L H0 X视频捕捉类CCaptureVideo的具体实现/ CCaptureVideo视频捕捉类头文件+ 8 e2 - a) n3 a r& Y# /#if!defined(AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_)( 7 C! Y6 e# k$ H! l o/ B#define AFX_CAPTUREVIDEO_
6、H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_* q5 q1 K8 G: n/ CaptureVideo.h : header file/#if _MSC_VER 1000#pragma once8 T5 E! a2 s: w p#endif / _MSC_VER 1000; P f) U8 ) m& b% : #include ( R5 n1 ! A# p, g* j8 2 K/ K#include 1 t* # u1 s: K7 E; L7 K! P#include #ifndef SAFE_RELEASE#define SAFE_RELE
7、ASE( x ) & W! C9 K- L& Kif ( NULL != x ) + r4 n% s% Z- X; e Q x-Release( ); x = NULL; ; Y# S/ u F6 # t( e2 W#endif& g& j$ Y $ _2 w M2 T& kclass CSampleGrabberCB;class CCaptureVideo : public CWnd& d; d E* d4 H j0 Hfriend class CSampleGrabberCB;public:, C& * 2 H+ v4 # void GrabOneFrame(BOOL bGrab);HRE
8、SULT Init(int iDeviceID,HWND hWnd);* : Q% * & z7 rint EnumDevices(HWND hList);CCaptureVideo();virtual CCaptureVideo();private:5 d, n& g g) S a J9 M- V- HWND m_hWnd;, R! x( 1 h8 + |$ jIGraphBuilder *m_pGB;ICaptureGraphBuilder2* m_pCapture;1 p4 s, q0 2 S1 H) n% r7 q PIBaseFilter* m_pBF;IMediaControl*
9、m_pMC;IVideoWindow* m_pVW;CComPtr m_pGrabber;protected:void FreeMediaType(AM_MEDIA_TYPE& mt);+ k& H, y* W2 1 U: Xbool BindFilter(int deviceId, IBaseFilter *pFilter);void ResizeVideoWindow();3 ; v) ; _) C& G; - ) WHRESULT SetupVideoWindow(); S ; & X6 m. h# l% F5 KHRESULT InitCaptureGraphBuilder();& x
10、+ L, r; J* M. o; F2 # a;#endif/!defined(AFX_CAPTUREVIDEO_H_F5345AA4_A39F_4B07_B843_3D87C4287AA0_INCLUDED_)3 J7 S! A+ Y- Q a1 E# N/-/ CCaptureVideo视频捕捉类实现文件CaptureVideo.cpp3 h) b7 q5 _1 j3 , v/ F; i7 /-/ CaptureVideo.cpp: implementation of the CCaptureVideo class.0 $ S% D, D e* u$ # . A3 T/ o( o7 S)
11、S M#include stdafx.h 2 P* _9 Q3 l! 6 X6 g3 #include CaptureVideo.h; b! a, t: ) S) _#ifdef _DEBUG: | r- 0 G$ b7 C#undef THIS_FILE2 7 N% p$ ! w- static char THIS_FILE=_FILE_;#define new DEBUG_NEW6 y3 s* o7 E: p) Z) P% l$ d* U( | i#endif- K/ r7 l2 * |0 M2 T; NBOOL bOneShot=FALSE;/全局变量4 , _1 5 s z3 s- X
12、7 uclass CSampleGrabberCB : public ISampleGrabberCB9 n A7 Y- I4 P4 Q: X gpublic:long lWidth;long lHeight;$ r7 q+ i) P8 ? t4 e& fTCHAR m_szFileNameMAX_PATH;/ 位图文件名称CSampleGrabberCB( )* x4 N7 K- Y3 Z0 n6 ustrcpy(m_szFileName, c:donaldo.bmp);STDMETHODIMP_(ULONG) AddRef() return 2; STDMETHODIMP_(ULONG)
13、Release() return 1; STDMETHODIMP QueryInterface(REFIID riid, void * ppv)if( riid = IID_ISampleGrabberCB | riid = IID_IUnknown )1 : V C8 F2 u9 f% d5 |& N/ E*ppv = (void *) static_cast ( this ); h4 E1 C7 i. V; U0 C9 areturn NOERROR;& ( j0 c L0 x+ P J! s+ o1 w# return E_NOINTERFACE; N1 t- F8 W! r* l2 p
14、2 7 b 7 _5 o R/ a! u8 P% v# nSTDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ) e, U Z2 d _+ e) l, ereturn 0; w* z) ! Y- J2 M0 b. a; o! c5 P9 # c0 LSTDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ). C1 P/ , 4 w. q7 A 7 p5 dif( !bOneShot )return 0;if (!pB
15、uffer)return E_POINTER;SaveBitmap(pBuffer, lBufferSize);& g8 e; 4 q7 O4 i2 wbOneShot = FALSE;2 i$ , S! B6 G: B4 _! J! greturn 0;$ j7 Q. f% & a5 w4 u( m* V4 /创建位图文件BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize )HANDLE hf = CreateFile( U& L4 6 U: U# X. V5 wm_szFileName, GENERIC_WRITE, FILE_SHARE_RE
16、AD, NULL,: e1 B- I# E/ ?5 oCREATE_ALWAYS, NULL, NULL );0 I0 l0 C8 I Bif( hf = INVALID_HANDLE_VALUE )return 0;. j) X6 Y J! T9 c/ L( H/ 写文件头, h# h# S% W( r gBITMAPFILEHEADER bfh;memset( &bfh, 0, sizeof( bfh ) );- A8 Y4 i6 E0 L 4 y4 _/ _3 obfh.bfType = MB;! V N6 T2 # Abfh.bfSize = sizeof( bfh ) + lBuff
17、erSize + sizeof( BITMAPINFOHEADER );& R2 V2 R 6 Q x J4 ; Fbfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );DWORD dwWritten = 0; U+ k0 A7 ( K9 aWriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );/ 写位图格式BITMAPINFOHEADER bih;memset( &bih, 0, sizeof( bih ) );( P& Z! B% D3 v6 s
18、5 1 I7 ?2 hbih.biSize = sizeof( bih );bih.biWidth = lWidth;8 E$ W6 x- O) r( + $ 4 Wbih.biHeight = lHeight;* & F& O) F# c% l7 ebih.biPlanes = 1;bih.biBitCount = 24;WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );/ 写位图数据$ _ L7 V$ j, |9 xWriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );/
19、( R2 D T, I W* s; ZCloseHandle( hf );return 0; M( F9 e 2 d2 ?, x. r3 R! q( 2 L;+ c( D; d2 x5 h6 v; F8 ICSampleGrabberCB mCB;/ q# K( i4 U4 l/ ) ?/ Construction/Destruction/* S/ X g7 K6 R0 q; CCaptureVideo:CCaptureVideo()1 ( i3 D. k7 P n9 a/COM Library Intializationif(FAILED(CoInitialize(NULL) /*, COI
20、NIT_APARTMENTTHREADED)*/ * R- g& r0 ?4 t( AfxMessageBox(CoInitialize Failed!rn);* z- g7 8 O+ A* T8 A, U! j. : w: w$ p3 return;* ? P4 L, p5 u1 K! b$ Y G* n5 t! 0 Bm_hWnd = NULL;/ q/ O# n$ k+ t0 Nm_pVW = NULL;* k, ?3 X+ c7 b$ S9 f8 2 v& y5 o$ m_pMC = NULL;1 0 / j$ w3 R7 Zm_pGB = NULL;m_pCapture = NULL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DirectShow 编程 实现 摄像头 视频 捕捉
限制150内