使用Sample Grabber过滤器扑获图像

本文介绍了如何利用Sample Grabber过滤器从视频文件中捕获图像。首先,需要配置Sample Grabber的媒体类型,然后建立包含Sample Grabber的过滤图形,并连接到视频源。接着,运行过滤图形,Sample Grabber可以工作在缓冲模式下,保存每个采样的副本。最后,通过GetCurrentBuffer方法获取缓冲的采样数据。
摘要由CSDN通过智能技术生成

 

Sample Grabber过滤器是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。

如果你想从一个视频文件中简单的扑获一桢,那么我建议你使用Media Detector对象。Sample Grabber提供了更复杂的更灵活的控制。我们通过下面的步骤使用Sample Grabber过滤器:

1、  指定你想要扑获的媒体类型

Sample Grabber 过滤器连接到别的过滤器之前你必须配置它。首先你要调用CoCreateInstance来创建Sample Grabber ,然后调用IfilterGraph::AddFilter来加载它到过滤图形中。然后查询IsampleGrabber接口。我们使用IsampleGrabber::SetMediaType方法来设置媒体类型。这个方法指定了Sample Grabber过滤器将要连接的媒体类型。你可以仅仅指定主媒体类型;或者主类型加子类型;或者主类型,子类型和类型格式。

例如,如果你想扑获一个未压缩的视频桢,这个视频桢要求是兼容当前显示模式的,你可以设置主类型为MEDIATYPE_Video然后设置基于当前显示位深的子类型。下面的例子也许能说明问题:

// 创建 Sample Grabber.
     
     
     
     
IBaseFilter *pF = NULL;
     
     
ISampleGrabber *pGrabber = NULL;
     
     
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
     
     
    IID_IBaseFilter, reinterpret_cast<void**>(&pF));
     
     
hr = pF->QueryInterface(IID_ISampleGrabber,
     
     
    reinterpret_cast<void**>(&pGrabber));
     
     
hr = pGraph->AddFilter(pF, L"SampleGrabber");
     
     
// 找到当前的色深
     
     
HDC hdc = GetDC(NULL);
     
     
int iBitDepth = GetDeviceCaps(hdc, BITSPIXEL);
     
     
ReleaseDC(NULL, hdc);
     
     
// 设置媒体类型
     
     
AM_MEDIA_TYPE mt;
     
     
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
     
     
mt.majortype = MEDIATYPE_Video;
     
     
switch (iBitDepth)
     
     
{
     
     
case 8:
     
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值