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

时间:2016-02-03 15:54:21

标签: c# directshow directshow.net

我使用此代码创建,并将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,文件会收到视频流(也没有再次运行图形)

我感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

您不能在不停止整个图表的情况下从DirectShow图表中删除过滤器。只是停止并再次运行媒体控制过滤器是不够的。在图表运行时,您甚至无法更改引脚连接。

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

  • 使用Windows Media SDK创建您自己的AsfWriter。这并不难,但你肯定会花一些时间阅读文档并实现这些东西。然后,您的自定义AsfWriter可能会有一个停止编码的例程,最终确定文件并告诉过滤器只删除所有其他传入的样本。我已经创建了一个可以在环形缓冲区中对视频进行编码的自定义AsfWriter
  • 另一种选择可能是创建三个图表(捕获,实时视图,实时视图和编码)并通过GMFBridge连接它们。无论如何你需要在那里做一些多线程的东西。

如果您可以停止图表,那么您可以创建两个独立的图表:一个用于捕获和显示预览,另一个用于预览。因此,在停止第一个图表后,启动第二个图表。

答案 1 :(得分:1)

解决方案是断开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();