Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用ISampleGrabber回调_C#_Wpf_Directshow_Directshow.net - Fatal编程技术网

C# 未调用ISampleGrabber回调

C# 未调用ISampleGrabber回调,c#,wpf,directshow,directshow.net,C#,Wpf,Directshow,Directshow.net,我正在使用DirectShow.Net并试图在类上实现ISampleGrabberCB 为了在图中设置抓取器,我遵循以下清单: 创建SampleGrabber对象 定义MediaType格式(AMMediaType:Video、Rgb、VideoInfo)并将其设置到SampleGrabber对象中。HRESULT是0,所以我认为它是可以的 我使用sampleGrabber.SetCallback(这个,0)设置回调。我之所以传递“this”,是因为ISampleGrabber是在类本身中实现和

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

为了在图中设置抓取器,我遵循以下清单:

  • 创建SampleGrabber对象

  • 定义MediaType格式(AMMediaType:Video、Rgb、VideoInfo)并将其设置到SampleGrabber对象中。HRESULT是0,所以我认为它是可以的

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

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

  • 但是,未调用ISampleGrabber.SampleCB方法

    你知道这种不良行为的原因吗

    [编辑]

    我已经知道这里发生了什么!但我仍然需要一些帮助。我拥有的两个网络摄像头都返回YUY2子类型视频格式。如上所述,我使用的代码强制MediaType转换为RGB24。在运行时,我可以看到HResult为0,因此它是正常的。但由于它们“不兼容”,因此从未调用示例回调。如果删除子类型显式定义,则会命中回调。然而,我收到的帧是YUY2;它不是有效的位图,因此看起来“损坏”、“扭曲”

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

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

    有什么想法吗

    干杯。
    Gianluca.

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

    查找将输入引脚设置为YUY2并将输出引脚设置为RGB32。然后再添加样本抓取器


    因为上面的过滤器是DMO过滤器,所以您需要使用。该链接有一个很好的使用示例。

    您需要添加YUY2到RGB转换器

    查找将输入引脚设置为YUY2并将输出引脚设置为RGB32。然后再添加样本抓取器


    因为上面的过滤器是DMO过滤器,所以您需要使用。这个链接有一个很好的使用它的例子。

    你从来没有提到你在图中连接了样本抓取器,这显然是必要的。因为在某个时候,回调击中了您,所以当然要以某种方式连接它,而且在您对媒体管道进行故障排除时,您首先要检查的是连接方式和有效的过滤器图拓扑

    24位RGB子类型是媒体类型的一种“公分母”,因此您几乎总是可以在示例抓取器上获得它。要实现这一点,您需要使用主类型和子类型初始化样本抓取器格式。然而,您不需要在那里进行格式输入。RGB 24的解码器将自动提供


    总而言之,如果某些东西不起作用,您需要知道最终得到的拓扑结构,并且样本抓取器需要进行适当的初始化。

    您从未提到在图形中连接样本抓取器,这显然是必要的。因为在某个时候,回调击中了您,所以当然要以某种方式连接它,而且在您对媒体管道进行故障排除时,您首先要检查的是连接方式和有效的过滤器图拓扑

    24位RGB子类型是媒体类型的一种“公分母”,因此您几乎总是可以在示例抓取器上获得它。要实现这一点,您需要使用主类型和子类型初始化样本抓取器格式。然而,您不需要在那里进行格式输入。RGB 24的解码器将自动提供


    总而言之,如果某些东西不起作用,您需要知道最终得到的拓扑结构,并且样本采集程序需要进行适当的初始化。

    @Goz:代码非常广泛,并分为几个功能。您希望看到哪个部分?根据您的编辑,最好看到您连接filters@Goz:代码非常广泛,可分为多个功能。您希望看到什么部分?根据您的编辑,可能会很高兴看到连接过滤器的部分谢谢您的回答!当我在DirectShow上迈出我的第一步时,我不知道该怎么做。你能指出一些可以帮助我的链接或提供一些片段吗?提前谢谢@Gianluca Colucci:不知道该怎么做?我已经设法让它与grpBuilder.RenderStream(PinCategory.Capture,MediaType.Video,this.capDev,null,(IBaseFilter)smpGrabber一起工作。没有它,抓取器就无法连接,我不明白它是如何工作的。接下来我有:hr=grpBuilder.RenderStream(PinCategory.Preview,MediaType.Video,this.capDev,null,Renderer);它起作用了。但这在概念上是正确的吗?谢谢你的回答!当我在DirectShow上迈出我的第一步时,我不知道该怎么做。你能指出一些可以帮助我的链接或提供一些片段吗?提前谢谢@Gianluca Colucci:不知道该怎么做?我已经设法让它与grpBuilder.RenderStream(PinCategory.Capture,MediaType.Video,this.capDev,null,(IBaseFilter)smpGrabber一起工作。没有它,抓取器就无法连接,我不明白它是如何工作的。接下来我有:hr=grpBuilder.RenderStream(PinCategory.Preview,MediaType.Video,this.capDev,null,Renderer);它起作用了。但这在概念上是正确的吗?