1

我正在使用 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。

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

您对这种不当行为的原因有任何想法吗?

[编辑]

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

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

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

任何想法?

干杯。詹卢卡。

4

2 回答 2

1

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

24 位 RGB 子类型是媒体类型的一种“公分母”,因此您几乎总能在样本采集器上获得它。为此,您使用主要类型和子类型初始化样本采集器格式。但是,您不需要在此处输入格式类型。将自动提供 RGB 24 的解码器。

总而言之,如果某些东西不起作用,您想知道最终得到的拓扑,并且 Sample Grabber 需要适当的初始化。

于 2013-07-29T07:53:43.580 回答
0

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

查找颜色转换器 DSP 将输入引脚设置为 YUY2,将输出引脚设置为 RGB32。然后在此之后添加样本采集器。

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

于 2011-09-16T13:41:58.437 回答