如何在运行时向图中添加/删除一些筛选器
本文关键字:删除 筛选 添加 运行时 | 更新日期: 2023-09-27 18:21:45
我想在运行时将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,但我想通过单击按钮添加录制功能。
如有任何帮助,我们将不胜感激。
简短回答
当过滤器图正在运行时,您无法添加/删除过滤器,也无法连接/断开引脚。您无法做到这一点的原因是,操作假定过滤器处于停止状态,而过滤器图状态转换假定图中的所有过滤器都随图本身而改变状态。
更长的答案
MSDN/DirectShow在使用动态重新连接方法运行时增加了更改拓扑的灵活性。虽然算法定义得很好,但股票过滤器和第三方过滤器很少实现它。也就是说,DirectShow的整个部分更多地是向开发者暗示"如果你渴望的话,你如何在自己的过滤器中实现它"。
C#代码是DirectShow技术的消费者,处理事实上可用的内容,而不是动态重新连接。一种典型的方法是桥接(请参阅Wimmel上面的评论,并搜索论坛——它被多次提及)。
另请参阅:
- 重新连接Directshow筛选器引脚
- Directshow连续捕获
- DirectShow中的GMF桥接使用