没有调用ISampleGrabber回调

时间:2011-09-13 14:17:37

标签: c# wpf directshow directshow.net

我正在使用DirectShow.Net并尝试在类上实现ISampleGrabberCB。

为了在图表中设置Grabber,我遵循以下清单:

  1. 创建SampleGrabber对象

  2. 定义MediaType格式(AMMediaType:Video,Rgb,VideoInfo)并将其设置为SampleGrabber对象。 HRESULT是0,所以我认为没关系。

  3. 我使用sampleGrabber.SetCallback(this,0)设置回调。我正在传递“this”,因为ISampleGrabber是在类本身中实现和定义的;第二个参数是0,因为我想调用SampleCB方法。

  4. 最后我将过滤器添加到图表中。 HRESULT再次为0.

  5. 但是没有调用ISampleGrabber.SampleCB方法。

    你对这种不端行为的原因有什么看法吗?

    [编辑]

    我发现这里发生了什么!但我仍然需要一些帮助。我拥有的两个网络摄像头都返回YUY2子类型视频格式。如上所述,我使用的代码强制MediaType为RGB24。在运行时我可以看到HResult为0,因此没关系。但由于它们“不兼容”,因此永远不会调用Sample Callback。如果我删除Subtype显式定义,则会触发Callback。然而,我收到的帧是YUY2;它不是一个有效的位图,因此它看起来“损坏”,“扭曲”。

    此时,我想知道如何成功强制RGB24格式或如何将视频帧转换为RGB24格式。

    我花了很多时间在谷歌试图找到一个有效的答案,但我没有运气。

    有什么想法吗?

    干杯。 詹卢卡。

2 个答案:

答案 0 :(得分:1)

你永远不会提到你在图表中连接Sample Grabber,这显然是必不可少的。因为在某些时候你有回调命中,你当然会以某种方式连接它,并且当你对媒体管道进行故障排除时,你连接的方式和有效的过滤器图形拓扑是你想要检查的第一件事。

24位RGB子类型是媒体类型的一种“共同点”,因此您几乎总能在样本采集器上获取它。要实现此目的,请使用主要类型和子类型初始化样本采集器格式。但是,您不需要在那里进行格式化。将自动提供RGB 24的解码器。

总而言之,如果某些东西不起作用,你想知道最终得到的拓扑结构,Sample Grabber需要正确的初始化。

答案 1 :(得分:0)

您需要添加YUY2到RGB转换器。

查找Color Converter DSP将输入引脚设置为YUY2,并将输出引脚设置为RGB32。然后在此之后添加样本抓取器。

由于上述过滤器是DMO过滤器,因此您需要使用DirectShow DMO wrapper。该链接有一个很好的使用它的例子。