【问题标题】:ISampleGrabber callback is not being called未调用 ISampleGrabber 回调
【发布时间】:2013-12-09 05:40:10
【问题描述】:

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

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

有什么想法吗?

干杯。 詹卢卡。

【问题讨论】:

  • @Goz:代码很广泛,分为几个函数。你想看哪一部分?
  • 好吧,鉴于您的编辑,看看您连接过滤器的部分可能会很好

标签: c# wpf directshow directshow.net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答!当我在 DirectShow 上迈出第一步时,我不确定如何做你所说的。您能否指出一些可以帮助我或为我提供一些 sn-p 的链接?提前致谢!
    • @Gianluca Colucci:不知道怎么办?
    • 我已经设法让它工作:grpBuilder.RenderStream(PinCategory.Capture, MediaType.Video, this.capDev, null, (IBaseFilter)smpGrabber)。没有它,抓取器就没有连接,我也不明白它是如何工作的。再往下我有: hr = grpBuilder.RenderStream(PinCategory.Preview, MediaType.Video, this.capDev, null, Renderer);有用。但它在概念上正确吗?
    猜你喜欢
    • 2014-11-23
    • 2018-05-01
    • 2018-01-09
    • 2014-05-30
    • 2014-12-31
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多