// FilterMgr.h: interface for the CFilterMgr class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_FILTERMGR_H__CCFDA7FF_DC20_417B_AA03_37FB2427996B__INCLUDED_)
#define AFX_FILTERMGR_H__CCFDA7FF_DC20_417B_AA03_37FB2427996B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <dshow.h>
#include <commctrl.h>
#include <commdlg.h>
#include <atlbase.h>
#ifndef SAFE_RELEASE
#define SAFE_RELEASE( x ) \
if ( NULL != x ) \
{ \
x->Release( ); \
x = NULL; \
}
#endif
#define DEFINE_FILTERLIST(x) FilterMap x [] =
#define DEFINE_FILTER(name, ppBF, ID) {(name), ((IBaseFilter**)ppBF), (GUID*)&ID},
#define FILTER_LIST_COUNT(x) (sizeof(list)/sizeof(FilterMap))
typedef struct
{
WCHAR* f_name; //filter 名
IBaseFilter** f_ppBF; //创建的filter
GUID* f_pID; //filter ID
}FilterMap;
/*
DEFINE_FILTERLIST(plist)
DEFINE_FILTER(L"AviMux", pAviMux, CLSID_AviMux);
DEFINE_FILTER(L"NetSnd", pNetSnd, CLSID_NetSnd);
*/
class CCapture
{
public:
CCapture(IGraphBuilder* pGB);
CCapture();
virtual ~CCapture();
operator IGraphBuilder*() const {return m_pGB;}
operator IMediaControl*() const {return m_pMC;}
//创建IGraphBuilder和IMediaControl 接口
HRESULT Open(IGraphBuilder* pGB=0);
//name可以为0
HRESULT OpenVideo(DWORD id, WCHAR* name, IBaseFilter** ppBF); //打开视频捕捉设备
HRESULT OpenAudio(DWORD id, WCHAR* name, IBaseFilter** ppBF); //打开音频捕捉设备
HRESULT FindInterface(const IID& id, void** pp); //查找Grapth中的接口
//添加filter
HRESULT AddFilter(IBaseFilter* pBF, const WCHAR* name);
HRESULT AddFilter(const GUID& guid, const WCHAR* name, IBaseFilter** ppBF);
HRESULT RemoveFilter(IBaseFilter* pBF);
HRESULT Connect(IPin* pOut, IPin* pIn);
HRESULT Connect(IBaseFilter* pBF1, int id, IBaseFilter* pBF2, int id2);
HRESULT Render(IPin* pOut);
HRESULT Render(IBaseFilter* pBF, int pOutID=0);
// "CapVideo(0)=>(0)FFDShow(0)=>(0)AviMux(0)=>(0)Writer\n"
// "CapVideo(1)=>\n"
// "CapAudio(0)=>\n"
HRESULT Render(WCHAR* format, FilterMap* maps, int nCount);
HRESULT Render(WCHAR* format);
HRESULT RenderFile(const char* file);
HRESULT RenderFile(const WCHAR* file);
HRESULT AddSourceFilter(LPCSTR lpwstrFileName, LPCSTR lpwstrFilterName, IBaseFilter **ppFilter);
HRESULT AddSourceFilter(LPCWSTR lpwstrFileName, LPCWSTR lpwstrFilterName, IBaseFilter **ppFilter);
// #ifdef UNICODE
// #define RenderFile RenderFileW
// #else
// #define RenderFile RenderFileA
// #endif // !UNICODE
//关闭时间戳
HRESULT CloseClock();
HRESULT Run();
HRESULT Pause();
HRESULT Stop();
//关闭IGraphBuilder
virtual void Close();
protected:
IGraphBuilder* m_pGB;
IMediaControl* m_pMC;
};
/********************************************/
/*
/*
/*
/*
/*********************************************/
class CCaptureMedia
{
public:
CCaptureMedia();
virtual~CCaptureMedia();
operator IBaseFilter*() const{return m_pBF;}
//初始化媒体接口
//pBF为pGB里的视频或音频设备filter
HRESULT Open(IGraphBuilder* pGB, IBaseFilter* pBF);
//打开指定设备
// HRESULT OpenVideo(int iDeviceID, WCHAR* name){return CCapture::OpenVideo(iDeviceID, name, &m_pBF);}
// HRESULT OpenAudio(int iDeviceID, WCHAR* name){return CCapture::OpenAudio(iDeviceID, name, &m_pBF);}
// HRESULT OpenVideo(int iDeviceID){return OpenVideo(iDeviceID, 0);}
// HRESULT OpenAudio(int iDeviceID){return OpenAudio(iDeviceID, 0);}
//有些设备没有预览PIN
HRESULT PreviewVideo(){return RenderPreviewVideo(0, 0);}
HRESULT PreviewAudio(){return RenderPreviewAudio(0, 0);}
//有些设备没有预览PIN
//MEDIATYPE_Video
//MEDIATYPE_Audio
HRESULT RenderPreviewVideo(IBaseFilter* pBF, IBaseFilter* pRBF){return m_pGB2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pBF, pBF, pRBF);}
HRESULT RenderPreviewAudio(IBaseFilter* pBF, IBaseFilter* pRBF){return m_pGB2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, m_pBF, pBF, pRBF);}
HRESULT RenderCaptureVideo(IBaseFilter* pBF, IBaseFilter* pRBF){return m_pGB2->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pBF, pBF, pRBF);}
HRESULT RenderCaptureAudio(IBaseFilter* pBF, IBaseFilter* pRBF){return m_pGB2->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio, m_pBF, pBF, pRBF);}
void Close();
protected:
ICaptureGraphBuilder2* m_pGB2; //视频扩展接口
IBaseFilter* m_pBF;
};
//单独捕获视频设备数据使用
/*
* 输出到文件,配置捕捉设备时使用
*/
class CCaptureVideo : public CCaptureMedia
{
public:
//捕获视频并保存为pType指定的格式文件,默认支持asf和avi
HRESULT CaptureToFile(const GUID *pType, LPCOLESTR lpwstrFile, IBaseFilter* pEncode, IBaseFilter** ppWrite);
HRESULT CaptureToAviFile(LPCOLESTR file);
//手动配置摄像头的视频格式 需要stop后调用
HRESULT ConfigCameraPin(HWND hwndParent);
//手动配置摄像头的图像参数,需要stop后调用
HRESULT ConfigCameraFilter(HWND hwndParent);
};
//单独捕获音频设备数据,未完成
class CCaptureAudio : public CCaptureMedia
{
public:
CCaptureAudio(IGraphBuilder* pGB);
CCaptureAudio();
virtual ~CCaptureAudio();
void Close();
};
class CFilter
{
public:
CFilter(IBaseFilter* pBF);
CFilter();
virtual ~CFilter();
operator =(IBaseFilter* pBF){m_pBF = pBF;m_pBF->AddRef();}
operator IBaseFilter*() {return m_pBF;}
operator IBaseFilter**() {return &m_pBF;}
//创建一个filter
HRESULT Create(const GUID& id);
//查找Filter上的接口
HRESULT FindInterface(const IID& id, void** pp);
/*以下获得的媒体类型用完后记得调用DeleteMediaType释放AM_MEDIA_TYPE结构*/
/*但不释放也不会出现错误*/
//获得指定PIn的媒体类型集,用完后记得释放AM_MEDIA_TYPE** ppmts
HRESULT GetMediaType(IPin* pin, AM_MEDIA_TYPE** ppmts, ULONG* pCount);
//获得指定PIN的媒体类型, pos为媒体类型序号
HRESULT GetMediaType(IPin* pin, int pos, AM_MEDIA_TYPE** ppmt);
//获得输入Pin的媒体类型
//id 输入pinID
//pos PIn上的媒体类型序号
//ppmt
// HRESULT GetMediaTypeIn(int id, int pos, AM_MEDIA_TYPE** ppmt);
//获得输出PIn上的媒体类型
// HRESULT GetMediaTypeOut(int id, int pos, AM_MEDIA_TYPE** ppmt);
/*****************************************/
//typedef enum _PinDirection
//{
// PINDIR_INPUT = 0,
// PINDIR_OUTPUT = PINDIR_INPUT + 1
//} PIN_DIRECTION ;
/*******************************************/
//获得指定类型的PIN
HRESULT GetPin(int id, PIN_DIRECTION pinKind, IPin** pin);
//根据id 获得PIN(不区分是输出还是输入PIN)
HRESULT GetPin(int id, IPin** pin);
//获得输出PIN,返回的IPin*指定已经被release一次,所以用完后无需理会
HRESULT GetOutPin(int id, IPin** ppin);
//获得输入PIN,返回的IPin*指定已经被release一次,所以用完后无需理会
HRESULT GetInPin(int id, IPin** ppin);
//获得filter的名字
HRESULT GetName(WCHAR* name_buf, int buf_len);
void Close();
protected:
IBaseFilter* m_pBF;
};
/**************************************************************/
/*
/* 显示窗口控制类(有窗口模式)
/*
/**************************************************************/
class CVideoWindow
{
public:
operator IVideoWindow*() const {return m_pVW;}
CVideoWindow();
virtual ~CVideoWindow();
//从一个IGraphBuilder接口查找一个IVideoWindow接口
HRESULT Open(IGraphBuilder* pGB);
//设置显示窗口
HRESULT SetVideoWindow(HWND hwnd);
/*这个函数可以在运行时调用*/
//将图像填满整个窗口
HRESULT ResizeVideoWindow();
HRESULT SetFullScreen(long mode);
HRESULT SetWindowPosition(long Left, long Top, long Width, long Height);
HRESULT NotifyOwnerMessage(HWND hwnd,long uMsg,LONG_PTR wParam,LONG_PTR lParam);
void Close();
protected:
IVideoWindow* m_pVW; //视频显示接口
};
/**********************************************/
//枚举视频或音频捕捉设备
class CEnumDevice
{
public:
CEnumDevice();
virtual ~CEnumDevice();
//CLSID_VideoInputDeviceCategory
//CLSID_AudioInputDeviceCategory
没有合适的资源?快使用搜索试试~ 我知道了~
directshow 播放接口封装库
共3个文件
lib:2个
h:1个
5星 · 超过95%的资源 需积分: 9 7 下载量 11 浏览量
2009-10-06
17:23:32
上传
评论
收藏 46KB RAR 举报
温馨提示
自己写的dirceshow 的播放库,只是对DS接口的简单封装,有很简单的接口没有被封装。有任何问题就留言吧。 下面是简单的简介 http://blog.csdn.net/scofield_zhang/archive/2009/10/06/4636378.aspx
资源推荐
资源详情
资源评论
收起资源包目录
DSplay.rar (3个子文件)
dsplayD.lib 136KB
dsplay.h 13KB
dsplay.lib 42KB
共 3 条
- 1
资源评论
- shenzhoudanpian2013-05-07没成功肯是我的方法不对,还是感谢你。
scofield_zhang
- 粉丝: 19
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功