如何发布WM ASF作家的视频文件

本文关键字:的视频 文件 作家 ASF 何发布 WM | 更新日期: 2023-09-27 18:33:00

我使用此代码创建并将 asf 编写器添加到我的图形中

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,文件将接收视频流(也不会再次运行图形(

我感谢任何帮助,谢谢。

如何发布WM ASF作家的视频文件

不能只从 DirectShow 图形中删除筛选器而不停止整个图形。仅停止并再次运行媒体控制筛选器是不够的。您甚至无法在图形运行时更改引脚连接。

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

  • 使用Windows Media 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();