2012-03-28 59 views
1

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

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

创建图表

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

最终该图是一组连接的COM对象,并且成功的图表终止依赖于正确的释放,而没有任何泄漏的参考文献。您可能尚未发布的引用会导致对象保持活动状态,并可能会锁定某些资源。

你能做的最好的是明确的终止/删除的各个对象:

  • 停止明确使用IFilterGraph2.RemoveFilter
  • 使用过滤器相关的方法调用可能终止单个过滤图
  • 删除所有fitlers,例如通过将空路径置于文件源/汇滤波器

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