DirectShow .Net AddSourceFilter发布文件

时间:2012-03-28 14:56:34

标签: directshow

我有一个使用DirectShow.Net播放视频并录制视频的应用程序。当我尝试记录刚刚用于DirectShow播放的文件名时,它仍然失败,因为文件仍在使用中。有时它会工作但需要5到60秒,直到文件解锁。在尝试录制之前,播放图形肯定已被破坏。创建和销毁图表的代码如下。如果我在播放后停止并启动我的应用程序,我可以录制到相同的文件名,并且没有文件锁定问题。

任何人都可以建议我如何正确释放源过滤器,以便文件不被锁定?

创建图表

try
{
    graphBuilder = (IGraphBuilder)new FilterGraph();

#if DEBUG
    // "Connect to remote graph" in GraphEdit
    rotEntry = new DsROTEntry(graphBuilder);
#endif

    hr = graphBuilder.AddSourceFilter(filename, filename, out baseFilter);
    DsError.ThrowExceptionForHR(hr);

    vmr9 = (IBaseFilter)new VideoMixingRenderer9();

    ConfigureVMR9InWindowlessMode();

    hr = graphBuilder.AddFilter(vmr9, "Video Mixing Renderer 9");
    DsError.ThrowExceptionForHR(hr);

    FilterGraphTools.ConnectFilters(graphBuilder, baseFilter, "Output", vmr9, "VMR Input0", true);
}

销毁图表

if (vmr9 != null)
{
    Marshal.ReleaseComObject(vmr9);
    vmr9 = null;
    windowlessCtrl = null;
}

if (graphBuilder != null)
{     
    // Remove and release all filters
    FilterGraphTools.RemoveAllFilters(graphBuilder);
    Marshal.ReleaseComObject(graphBuilder);
    graphBuilder = null;
    baseFilter = null;
}
#if DEBUG
if (rotEntry != null)
{
    rotEntry.Dispose();
    rotEntry = null;
}
#endif

1 个答案:

答案 0 :(得分:1)

最终,图形是一组连接的COM对象,成功的图形终止取决于正确的版本,没有任何泄漏的引用。您可能未发布的引用会导致对象保持活动状态并可能锁定某些资源。

您可以做的最好是明确终止/删除单个对象:

  • 停止图表
  • 使用IFilterGraph2.RemoveFilter
  • 明确删除所有装配工
  • 使用依赖于过滤器的方法调用可能会终止单个过滤器,例如将空路径放到文件源/接收器过滤器

如果发生泄漏,图表不应再引用资源。请注意,如果要重新创建图形,有时也可以重复使用过滤器。