2011-09-13 66 views
1

我正在使用DirectShow.Net并试图在类上实现ISampleGrabberCB。ISampleGrabber回调没有被调用

为了建立抓取的图形,我按照这个清单:

  1. 创建SampleGrabber对象

  2. 定义的MediaType格式(AMMediaType:视频,RGB,VideoInfo)和将其设置为SampleGrabber对象。 HRESULT为0,所以我认为没关系。

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

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

但是ISampleGrabber.SampleCB方法未被调用。

你对这种不正当行为的原因有什么想法吗?

[编辑]

我发现了这是怎么回事了!但我仍然需要一些帮助。我拥有的网络摄像机都会返回YUY2子视频格式。如上所述,我使用的代码强制MediaType为RGB24。在运行时我可以看到HResult为0,因此没关系。但是因为它们“不兼容”,所以不会调用示例回调。如果我删除了子类型显式定义,则回调被击中。然而我收到的框架是YUY2;它不是有效的位图,因此它看起来“损坏”,“失真”。

在这一点上,我想知道我是如何成功地强制RGB24格式或如何将视频帧转换为RGB24格式。

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

有什么想法?

干杯。 Gianluca。

+1

我们可以看到一些代码吗? – Goz

+0

@Goz:代码非常丰富,可以分成几个功能。你想看什么部分? –

+0

根据您的编辑情况,可能会很高兴看到连接滤镜的部分 – Goz

回答

0

您需要添加一个YUY2 RGB转换器。

查找Color Converter DSP将输入引脚设置为YUY2并将输出引脚设置为RGB32。然后添加采样器。

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

+0

感谢您的回答!当我在DirectShow上迈出第一步时,我不知道如何去做你说的话。您能否指出一些可以帮助我解决问题或提供一些片段的链接?提前致谢! –

+0

@Gianluca Colucci:不知道该怎么做? – Goz

+0

我设法使它与:grpBuilder.RenderStream(PinCategory.Capture,MediaType.Video,this.capDev,null,(IBaseFilter)smpGrabber)。没有它,抓取器没有连接,我不明白它是如何工作的。更进一步,我有:hr = grpBuilder.RenderStream(PinCategory.Preview,MediaType.Video,this.capDev,null,Renderer);有用。但是在概念上是对的吗? –

1

你从来没有提到你在图中连接Sample Grabber,这显然是必不可少的。由于在某些时候,你有回调打击,当然你可以用某种方式连接它,并且仍然以你连接的方式排除媒体管道故障,并且有效的过滤器图形拓扑结构是你想要检查的第一件事。

24位RGB子类型是一种媒体类型的“公分母”,因此您几乎可以在样本采集卡上找到它。为了达到这个目的,你用主要类型和子类型初始化采样卡格式。但是,您不需要在那里进行格式化。解码器到RGB 24将自动提供。总而言之,如果某件事不起作用,你想知道你最终得到的拓扑结构,并且Sample Grabber需要正确的初始化。

相关问题