我编写了一个实现IStream的过滤器(COM接口而不是C ++标准库类)。这一切都运行良好,但我的问题是我不确定何时(如果有的话)我可以确定不会发送更多的IStream命令,因此可以关闭IStream后面的流。
关闭流的最简单的地方是我的过滤器上的Stop(),但这太早了。
根据MSDN文档,过滤器图形管理器将按上游顺序在图形中的过滤器上调用Stop(),因此我的过滤器将在上游多路复用过滤器之前获得停止,该过滤器通常将使用IStream来执行流式修复的任何结束(例如, GDCL mp4 mux过滤器)。我在调试器中验证了我的过滤器上的Stop()被调用,并在上游过滤器调用Stop()之前退出(这可能会导致对我的过滤器进一步调用IStream)。
系统Microsoft文件编写器过滤器似乎能够解决这个问题。在流式传输期间,文件编写器写入的接收器文件无法按照您的预期进行重命名或移动,但一旦流式传输停止,文件就可以移动。 Microsoft文件编写器如何检测到关闭文件是否安全?一旦图表中的所有过滤器都停止或者通过插件分发器停止监听图形状态更改的结束,它是否会获得某种额外的回调?释放IStream接口并且引用计数降为零时是否关闭文件?
答案 0 :(得分:2)
自从我问了这个问题已经有一段时间了,我仍然没有弄清楚MS文件编写器在关闭其输出文件时如何计算出来。
以下是一些可能的解决方案,其中一些比其他更好: