Video 在Avi Muxer和文件编写器之间插入过滤器?

Video 在Avi Muxer和文件编写器之间插入过滤器?,video,directshow,avi,video-recording,Video,Directshow,Avi,Video Recording,是否可以在Avi Mux过滤器和文件编写器过滤器之间插入过滤器。 图形生成器通过调用ICaptureGraphBuilder2::SetOutputFileName插入并自动连接两个过滤器。由于文件编写器的接口来自IFileSinkFilter类型(不是从IBaseFilter派生的),因此此接口不公开任何函数,如断开连接或连接,也不枚举过滤器引脚。因此,我无法在这两个过滤器之间插入过滤器。 这是否是MS有意将两个过滤器作为一种原子结构?或者是否有其他方法来管理此问题。您可以在此处插入一个筛选器

是否可以在Avi Mux过滤器和文件编写器过滤器之间插入过滤器。 图形生成器通过调用ICaptureGraphBuilder2::SetOutputFileName插入并自动连接两个过滤器。由于文件编写器的接口来自IFileSinkFilter类型(不是从IBaseFilter派生的),因此此接口不公开任何函数,如断开连接或连接,也不枚举过滤器引脚。因此,我无法在这两个过滤器之间插入过滤器。
这是否是MS有意将两个过滤器作为一种原子结构?或者是否有其他方法来管理此问题。

您可以在此处插入一个筛选器,但正如您所注意到的,它需要是一个不同的筛选器。具体而言,“s”输入引脚实现
IStream
接口。这也是我们所期望的


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

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

如果这一点不清楚,请确保您对DirectShow有很好的基本了解,因为这在整个DirectShow中都有使用。另请参阅以下内容,这些内容都写得很好,而且是明确的:

如果您恰巧在C++中工作,而不是C++,那么如果我正确地记得,您可以在不同的C.*COM包装对象之间进行转换,以自动为相应的接口查询接口,如果QueryInterface失败了(实际上不是我的专业领域),结果是空的。 在您的一条评论中,您提到了示例抓取器。如果您试图抓取音频或视频帧,则需要将样本抓取器放在avi mux滤波器的输入引脚之前

AVI mux和file writer之间的mediatype流连接实际上只是通过pin连接发送简单I/O命令以写入/读取字节流的一种方式(AVI mux的工作是确定格式)。这些IStream调用或采样并不总是对应于音频或视频的各个帧


file write analyzer筛选器将显示各个示例和IStream调用

至少样本采集过滤器不能作为中间过滤器工作。似乎我必须编写自己的兼容过滤器。我想我知道如何处理QueryInterface方法。您的第二段最后一段证实了我的假设,即avi muxer和file writer之间的pin连接不像其他连接,并且不可能在两个过滤器之间放置过滤器。
IFileSinkFilter *pFileSink;
IBaseFilter* filter = NULL;
hr = pFileSink->QueryInterface( IID_IBaseFilter, (void **)&filter );