【问题标题】:How to add/remove some filters to graph at runtime?如何在运行时添加/删除一些过滤器以绘制图表?
【发布时间】:2014-09-14 15:01:30
【问题描述】:

我想在运行时将 Compressor、Avi Muxer 和 File Writer 添加到我的图表中。 我在我的图表中添加了一个 InfTee,如下所示:

            IBaseFilter sourceTee = (IBaseFilter)new InfTee();
            graphBuilder.AddFilter(sourceTee, "Infinite Tee");
            outPin = DsFindPin.ByDirection(theVideoDevice, PinDirection.Output, 0);
            inPin = DsFindPin.ByDirection(sourceTee, PinDirection.Input, 0);
            hr = graphBuilder.Connect(outPin, inPin); 

但是当我尝试像下面的代码一样点击按钮时,我得到一个错误。

    private void button1_Click(object sender, EventArgs e)
    {

        IPin outPin, inPin;
        int hr;


        // Connect To Compressor
        outPin = DsFindPin.ByDirection(Preview_Class.smartTeeFilter, PinDirection.Output ,1);
        inPin = DsFindPin.ByDirection(Preview_Class.theVideoCompressor, PinDirection.Input, 0);
        hr = Preview_Class.graphBuilder.Connect(outPin, inPin);
        DsError.ThrowExceptionForHR(hr);
        // etc
        }

我必须注意,我在预览时为我的视频渲染器获得了一个输出引脚 0,但我想通过单击一个按钮来添加录制功能。

任何帮助将不胜感激。

【问题讨论】:

  • 你不清楚 - 1 在运行时是“运行时来自代码”还是“当图形运行时”? 2你得到什么错误代码?
  • 在我看来问题不是在运行时添加/删除过滤器,而是to record without stopping preview。 (简短回答,使用 GMFBridge)。
  • Roman,我的意思是在图表运行时。威梅尔,谢谢。

标签: c# video directshow directshow.net


【解决方案1】:

简答

过滤器图运行时,您无法添加/删除过滤器,也无法连接/断开引脚。您无法做到这一点的原因是,这些操作假定过滤器处于停止状态,而过滤器图形状态转换假定图形中的所有过滤器都随着图形本身改变状态。

更长的答案

MSDN/DirectShow 在使用Dynamic Reconnection 方法运行时增加了更改拓扑的灵活性。虽然算法定义得很好,但股票过滤器和第三方过滤器很少实现它。也就是说,DirectShow 的整个部分更多地是对开发人员的提示“如果你渴望的话,如何在你自己的过滤器中实现它”。

C# 代码是 DirectShow 技术的消费者,处理事实上可用的内容,而不是动态重新连接。一个典型的方法是bridging(参见上面 Wimmel 的评论,并搜索论坛 - 它被多次提及)。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多