在Avi Muxer和File Writer之间插入过滤器?

时间:2018-06-26 09:43:51

标签: video directshow avi video-recording

是否可以在Avi Mux过滤器和文件编写器过滤器之间插入过滤器。 图形构建器通过调用ICaptureGraphBuilder2 :: SetOutputFileName插入并自动连接两个过滤器。由于文件编写器的接口来自IFileSinkFilter类型(不是从IBaseFilter派生),因此该接口不会公开任何功能,例如Disconnect或Connect或枚举过滤器引脚。因此,我找不到在这两个过滤器之间插入过滤器的方法。 MS是否有意将两个过滤器都视为一种原子构造?还是有其他方法可以解决这个问题。

2 个答案:

答案 0 :(得分:0)

您可以在此处插入一个过滤器,但是您已经注意到它必须是其他过滤器。具体来说,File Writer Filter的输入引脚实现了IStream接口。 AVI Mux Filter也期望如此。

如果提供兼容的过滤器,则可以通过它进行连接。

答案 1 :(得分:0)

Microsoft文件编写器筛选器确实公开了IBaseFilter接口以及IFileSinkFilter(可能还有其他接口)。您只需要使用QueryInterface来获取该接口(而不是从IBaseFilter继承的IFileSinkFilter)。

IFileSinkFilter *pFileSink;
IBaseFilter* filter = NULL;
hr = pFileSink->QueryInterface( IID_IBaseFilter, (void **)&filter );

如果不清楚,请确保您对COM有很好的基本了解,因为DirectShow中使用了该知识。另请参阅Microsoft DirectShow documentation,它写得很好并且确定:

如果碰巧使用C#而不是C ++,则可以正确调用,可以在不同的C#COM包装器对象之间进行转换,以自动为对应的接口使用QueryInterface,如果QueryInterface失败,则结果为null(这并不是我的专长)专业知识。)

在您的评论之一中,您提到了样本采集器。如果要尝试获取音频或视频帧,则需要将采样器置于 avi mux滤波器的输入引脚之前。

AVI mux与文件编写器之间的媒体类型流连接实际上只是通过引脚连接发送简单I / O命令以写入/读取字节流的一种方法(这是AVI mux的工作,用于确定格式)。这些IStream呼叫或样本将并不总是对应于音频或视频的各个帧。

GraphStudioNext文件写分析器过滤器将为您显示各个样本和IStream调用。