DShow中实现抓图的几种方法

本文详细介绍了在DirectShow中实现抓图的三种方法:使用Sample Grabber Filter,通过IBasicVideo::GetCurrentImage接口以及利用IMediaDet接口。重点讨论了Sample Grabber Filter的派生与接口调用,以及如何获取和保存图像数据。
摘要由CSDN通过智能技术生成

1.加入Sample Grabber Filter

当我们加入Sample Grabber Filter的时候,我们可以直接调用其接口(interfaceISampleGrabber。该接口可以获取经过该Filter的单独的Media Samples。详情请参见DXSDK

1.1 派生出自己的Sample Grabber

ISampleGrabberCB中派生出自己的类,然后实现其虚函数,详情请参见SDK中的示例程序(DXSDK ROOT/Samples/C++/DirectShow/Editing/GrabBitmaps)

1.2 直接调用Sample Grabber Filter的接口

如果我们在播放的过程中动态的加入Filter的话,操作和效率都不乐观。所以我采用下面的方法:

该方法传递的是时间,不是在播放的时候动态加入Filter然后截图,而是另外打开源文件进行操作。

A)。申明以下接口:

#001 IGraphBuilder   *pGraph       = NULL; //for graph builder

#002 IMediaControl   *pControl     = NULL; //media control

#003 IMediaSeeking   *pSeeking     = NULL; //media seeking

#004 IMediaEventEx   *pEvent       = NULL; //media envent

#005 IBaseFilter      *pNullFilter =NULL;//for holding the Sample grabber Filter

B)。初始化接口:

#001 JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,

#002                  IID_IGraphBuilder, (void **)&pGraph));

#003

#004 JIF(CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC,

#005                 IID_IBaseFilter, (void **)&pNullFilter));

#006 JIF(pGraph->QueryInterface(IID_IMediaControl,(void                                     **)&pControl));

#007 JIF(pGraph->QueryInterface(IID_IMediaSeeking, (void                                **)&pSeeking));

#008 JIF(pGraph->QueryInterface(IID_IMediaEvent, (void                                  **)&pEvent));

C)。创建Sample Grabber

#001 // Create the Sample Grabber.

#002 IBaseFilter *pGrabberF = NULL;

#003 JIF(CoCreateInstance(CLSID_SampleGrabber,NULL, CLSCTX_INPROC_SERVER,

#004                             IID_IBaseFilter, (void**)&pGrabberF));

#005

#006 JIF(pGraph->AddFilter(pGrabberF, L"Sample Grabber"));

#007 JIF(pGraph->AddFilter(pNullFilter, L"Null Render Filter"));

#008

#009 ISampleGrabber *pGrabber;

#010 JIF(pGrabberF->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber));

设置Sample Grabber的媒体格式:调用SetMediaType,该函数接受一个AM_MEDIA_TYPE的结构,主要是设置该结构中的majortype,和subtype域。

D)。添加Source Filter

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值