directshow实现视频捕获
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
directshow实现视频捕获(源码)vs2005
金钻传奇 mail@
我用visual studio 2005编了一个摄像头预览程序,还可以导出成avi文件,前提是要安装directshow,并搭建好环境,我安装的是directx 9.0b,搭建环境很简单,网上有很多,注意在项目-属性-配置属性-链接器-输入中要加上strmbasd.lib winmm.lib(中间有空格)。源代码如下:
/*CaptureClass.h*/
#pragma once
#include
#include
#include
#include
#ifndef SAFE_RELEASE
#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }
#endif
class CCaptureClass
{
public:
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 < 0) return false ;
//枚举所有的视频捕获设备
ICreateDevEnum *pCreateDevEnum ;
//生成设备枚举器pCreateDevEnum
HRESULT hr =
CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDe vEnum,(void**)&pCreateDevEnum);
if( hr != NOERROR ) return false ;
IEnumMoniker *pEm;
//创建视频输入设备类枚举器
hr =
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm,0); if( hr != NOERROR ) return false ;
pEm->Reset(); //复位该设备
ULONG cFetched;