将FFDShow编码为DirectShow图以进行逐行扫描?

时间:2014-04-10 12:12:23

标签: c++ directshow video-processing ffdshow interlacing

好吧,我一直在寻找一段时间,而且我现在很难过。我很感激我能找到的任何帮助。

我有一个应用程序可以在多个过滤器图表上打开多个摄像头。它们中的每一个都是相同的,所以我只是要说明其中一个。高级想法是通过视频采集卡读取PAL视频流,然后由我们的应用程序处理。该应用程序构建DirectShow视频过滤器图形。每个图包括一个视频源,一个样本抓取器过滤器和一个空渲染器过滤器。然后使用抓取的样本显示视频中的各种静止图像,并使用OpenCV进行绘制和缩放。因此,当前的过滤器图形如下所示:

[视频来源] - > [/ *某种编解码器过滤器* /] - > [Sample Grabber] - > [Null Renderer]

我说'某种',因为我允许DirectShow使用

自行渲染它
hr = pCaptureGraphs[i]->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSourceFilters[i], pGrabberFilters[i], pNullRendFilters[i]);

但是,我遇到来自PAL视频的隔行扫描问题。使用FFDShow和GraphEditor应用程序,我构建了一个类似于上面的图形,但在SampleGrabber之前使用FFDShow过滤器,设置为对视频源执行立方反交错。或者,更好的是,使用它来解码来自视频采集器的视频流并对其进行解交错。

我的问题是:我不知道如何在代码中创建FFDShow过滤器。有没有办法在代码中添加过滤器,如果有,我可以包含或链接到项目中这样做什么?或者,有没有办法配置DirectShow以使用FFDShow过滤器来调用RenderStream时进行反交错?

对此主题的任何帮助都将不胜感激。

更新1:

好的,所以我发现我正在开发的PC,一台Windows 8.1机器,由于某种原因没有运行FFDShow过滤器,但目标机器,Windows 7机器,运行完全相同的代码就好了。似乎那里存在某种不相容性。 :/

现在进入下一阶段:逐行扫描。我设法隔离了Sample Grabber过滤器和它前面的过滤器(在这种情况下,AVI解压缩器),我已将它们彼此断开,然后在它们之间连接FFDShow原始视频过滤器。另一个FFDShow过滤器以某种方式弄乱图表,没有从样本采集器读取输出,所以我将使用前一个过滤器。现在的问题是,如何激活视频源的反交错?我在GraphEdit程序中构建了相同的图形,隔行扫描消失了,所以我知道过滤器能够做到这一点。但是如何在代码中启用它?

更新2 /解决方案

我设法通过运行过滤器图表,然后选择过滤器的托盘图标并通过右键单击图标在菜单中设置逐行扫描来使其工作。这非常有效。感谢Roman R的帮助。

1 个答案:

答案 0 :(得分:1)

您需要在代码中创建FFDshow视频解码器的实例,例如:

class __declspec(uuid("{04FE9017-F873-410E-871E-AB91661A4EF7}")) FfdshowVideoDecoder;
CComPtr<IBaseFilter> pBaseFilter;
HRESULT nResult = pBaseFilter.CoCreateInstance(__uuidof(FfdshowVideoDecoder));

然后您IGraphBuilder::AddFilter到过滤器图表

然后您从此实例查询输入/输出IPin并正确连接到其他过滤器,类似于您在GraphEdit中以交互方式执行此操作。如果您使用此IBaseFilter作为中间过滤器,您也可以通过RenderStream完成此操作。