如何发布 WM ASF Writer 的视频文件

How to release the Video File of WM ASF Writer

我使用这段代码创建一个 asf Writer 并将其添加到我的图表中

IFileSinkFilter pTmpSink = null;
IBaseFilter asfWriter = null;
int hr = capGraph.SetOutputFileName( MediaSubType.Asf, szOutputFileName,
 out asfWriter, out pTmpSink);

我想停止保存视频捕获,释放视频文件,然后重新运行图表以便继续预览。

m_mediaCtrl.Stop();
Marshal.ReleaseComObject(asfWriter);
m_mediaCtrl.Run();

问题是当我发布asfWriter时,文件没有收到视频捕获,而且它的大小总是5.08KB。如果我没有释放 asfWriter,文件将接收视频流(也不会再次 运行 图形)

感谢任何帮助,谢谢。

您不能只从 DirectShow 图形中删除过滤器而不停止整个图形。仅仅停止并再次 运行 媒体控制过滤器是不够的。当图形为 运行.

时,您甚至无法更改引脚连接

因此,如果您想在无缝继续实时预览的同时停止捕获到文件,我建议有两个选项:

  • 使用 Windows 媒体 SDK 创建您自己的 AsfWriter。这并不难,但您肯定会花一些时间阅读文档并实现这些东西。然后,您的自定义 AsfWriter 可以有一个停止编码、完成文件并告诉过滤器丢弃所有进一步传入样本的例程。我创建了这样一个自定义 AsfWriter 可以在环形缓冲区中对视频进行编码。
  • 另一种选择是创建三个图形(捕获、实时取景、实时取景加编码)并通过 GMFBridge 连接它们。无论如何,你需要在那里做一些多线程的事情。

如果您不介意停止图形,则可以创建两个独立的图形:一个捕获并显示预览,另一个仅用于预览。所以在停止第一个图表后,开始第二个。

解决方案是断开 asfWriter 与图形的连接,然后将其删除。 在我的例子中,它连接到 SmartTee 的引脚 0。希望这对其他人有帮助。

m_mediaCtrl.Stop();
if(asfWriter != null)
{
      IPin pin = DsFindPin.ByDirection(iSmartTee, PinDirection.Output, 0);
      hr = m_FilterGraph.Disconnect(pin);
      hr = m_FilterGraph.RemoveFilter(asfWriter); 
}
m_mediaCtrl.Run();