好的,我已经逛了一会儿了,我现在很沮丧。我很乐意为此提供任何帮助。
我有一个可以在多个过滤器图上打开多个摄像机的应用程序。它们中的每一个都是相同的,因此我仅说明其中之一。高层次的想法是通过视频采集卡读取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配置为使用FFDShow过滤器,该过滤器在调用RenderStream时进行去隔行处理?
任何有关此主题的帮助将不胜感激。
更新1:
好的,所以我发现我在开发的PC(Windows 8.1计算机)由于某种原因未运行FFDShow筛选器,但是目标计算机(Windows 7计算机)运行的代码完全相同。似乎那里存在某种不兼容性。 :/
现在进入下一阶段:逐行扫描。我设法隔离了Sample Grabber过滤器和它之前的过滤器(在本例中为AVI解压缩器),并已将它们彼此断开连接,然后在它们之间连接了FFDShow原始视频过滤器。另一个FFDShow过滤器以某种方式弄乱了图形,使得没有从样本采集器读取任何输出,因此我将使用前一个过滤器。现在的问题是,如何激活视频源的去隔行扫描?我已经在GraphEdit程序中构建了相同的图形,并且隔行扫描消失了,所以我知道过滤器可以做到这一点。但是如何在代码中启用它呢?
更新2 /解决方案
通过运行过滤器图,然后选择过滤器的任务栏图标,然后右键单击该图标,在菜单中设置了逐行扫描,我设法使其正常运行。那很好。感谢Roman R的帮助。
最佳答案
您需要使用代码创建FFDshow Video Decoder的实例,例如:
class __declspec(uuid("{04FE9017-F873-410E-871E-AB91661A4EF7}")) FfdshowVideoDecoder;
CComPtr<IBaseFilter> pBaseFilter;
HRESULT nResult = pBaseFilter.CoCreateInstance(__uuidof(FfdshowVideoDecoder));
然后您
IGraphBuilder::AddFilter
到过滤器图然后,您可以从该实例中查询输入/输出
IPin
,并适当地连接到其他过滤器,类似于在GraphEdit中进行交互的方式。如果将此IBaseFilter用作中间过滤器,也可以通过RenderStream
完成。关于c++ - 将FFDShow编码到DirectShow图形中以进行去隔行处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22987700/