0

好的,我已经环顾四周了,目前我很困惑。我会很感激我能找到的任何帮助。

我有一个应用程序可以在多个过滤器图上打开多个摄像头。它们中的每一个都是相同的,所以我将仅说明其中一个。高级想法是通过视频采集卡读入 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 的帮助。

4

1 回答 1

1

您需要在代码中创建 FFDshow Video Decoder 的实例,例如:

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

然后你IGraphBuilder::AddFilter到过滤器图

然后您从该实例查询 input/outputIPin并适当地连接到其他过滤器,类似于您在 GraphEdit 中以交互方式执行此操作的方式。RenderStream如果您使用此 IBaseFilter 作为中间过滤器,您也可以完成此操作。

于 2014-04-11T10:07:53.883 回答