使用Sample Grabber过滤器扑获图像

 

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
    评论
引用\[1\]:要处理这个调用,驱动会查看请求的视频格式,然后断定硬件是否支持这个格式。如果应用请求的格式是不被支持的,就会返回 -EINVAL。例如,描述了一个不支持格式的 fourcc 编码或者去请求了一个隔行扫描的视频,而设备只支持逐行扫描的就会失败。在另一方面,驱动可以调整 size 字段,以与硬件支持的图像大小相适应。通常的做法是尽量将大小调小。所以一个只能处理 VGA 分辨率的设备驱动会根据情况相应地调整 width 和 height 参数而成功返回。v4l2_format 结构体会在调用后复制给用户空间,驱动应该更新这个结构体以反应改变的参数,这样应用才可以知道它真正得到是什么。\[1\] 引用\[2\]:没错,就是关于服务启动相关的。我们需要对它进行修改。我们再看看我们上面的启动命令: > ./mjpg_streamer -i "./input_uvc.so -r 1920 x 1080 -f 30 " -o "./output_http.so -w ./www" 。\[2\] 引用\[3\]:来看看 vivi.c 中对于这个回调函数的实现: static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *f) { struct vivi_dev *dev = video_drvdata(file); f->fmt.pix.width = dev->width; f->fmt.pix.height = dev->height; f->fmt.pix.field = dev->field; f->fmt.pix.pixelformat = dev->fmt->fourcc; f->fmt.pix.bytesperline = (f->fmt.pix.width * dev->fmt->depth) >> 3; f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; if (dev->fmt->fourcc == V4L2_PIX_FMT_YUYV || dev->fmt->fourcc == V4L2_PIX_FMT_UYVY) f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; else f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; return 0; } 。\[3\] 问题: vertical-grabber是什么? 回答: 根据提供的引用内容,没有找到关于vertical-grabber的具体信息。请提供更多相关的上下文或信息,以便我能够更好地回答您的问题。 #### 引用[.reference_title] - *1* *3* [[Linux 基础] -- V4L2 实例分析 —— vivi.c 源码详解(深度好文)](https://blog.csdn.net/u014674293/article/details/115378289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问](https://blog.csdn.net/weixin_44614230/article/details/127820225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kathywp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值