好吧,我已经看了一段时间了,我现在很困惑。我希望能在这个问题上找到任何帮助。
我有一个应用程序,可以在多个过滤器图上打开多个摄像机。每一个都是相同的,所以我只想举例说明其中一个。高级思想是通过视频采集卡读取PAL视频流,然后由我们的应用程序处理。该应用程序建立了DirectShow视频过滤图。每个图形包括一个视频源、一个样本抓取过滤器和一个空呈现器过滤器。然后,抓取的样本被用于显示视频中的各种静态画面,并在OpenCV上绘制和缩放。因此,当前的过滤器图如下所示:
视频源-> /*某种编解码器滤波器*/ ->样本抓取器->空渲染器
我说“某种”,因为我允许DirectShow自己呈现它,使用
hr = pCaptureGraphs[i]->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSourceFilters[i], pGrabberFilters[i], pNullRendFilters[i]);然而,我有一个问题,交织来自PAL视频。使用FFDShow和GraphEditor应用程序,我构建了一个类似于上面的图形,但在SampleGrabber之前使用了一个FFDShow过滤器,设置为在视频提要上执行立方体去交错。或者,更好的是,使用它来解码来自视频抓取器的视频流,以及去交织它。
我的问题是:我不知道如何在代码中创建FFDShow过滤器。是否有一种方法可以在代码中添加筛选器,如果是的话,我应该包括哪些内容或链接到项目以实现此目的?或者,是否有一种方法来配置DirectShow以使用在调用RenderStream时进行去交错的FFDShow筛选器?
如能就这一问题提供任何帮助,将不胜感激。
更新1:
好的,我发现我正在开发的PC,一台Windows8.1机器,由于某种原因没有运行FFDShow过滤器,但是目标机器,一台Windows7机器,运行完全相同的代码。好像有什么不相容的地方。:/
现在进入下一个阶段:去交错。我已经成功地隔离了示例Grabber过滤器和它之前的过滤器(在本例中是AVI解压缩器),并且我将它们彼此断开连接,然后在它们之间连接FFDShow原始视频过滤器。另一个FFDShow过滤器在某种程度上扰乱了图形,即没有从样本抓取器读取输出,所以我将使用前一个过滤器。现在的问题是,我如何激活视频传输的去交错?我已经在GraphEdit程序中构建了相同的图,并且交错消失了,所以我知道过滤器能够做到这一点。但是如何在代码中启用它呢?
更新2/解决方案
我通过运行过滤器图,然后选择过滤器的托盘图标,并通过右键单击图标来设置菜单中的去隔行。效果很好。感谢罗曼·R的帮助。
发布于 2014-04-11 10:07:53
您需要在代码中创建FFDshow视频解码器的实例,例如:
class __declspec(uuid("{04FE9017-F873-410E-871E-AB91661A4EF7}")) FfdshowVideoDecoder;
CComPtr<IBaseFilter> pBaseFilter;
HRESULT nResult = pBaseFilter.CoCreateInstance(__uuidof(FfdshowVideoDecoder));然后IGraphBuilder::AddFilter到过滤器图
然后从这个实例查询输入/输出IPin,并适当地连接到其他过滤器,类似于您如何在GraphEdit中交互地这样做。如果您使用这个RenderStream作为中间过滤器,您也可以让IBaseFilter来完成这个任务。
https://stackoverflow.com/questions/22987700
复制相似问题