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: