2012-03-28 63 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,例如通過將空路徑置於文件源/匯濾波器

如果發生泄漏,圖形將不再引用資源。請注意,如果您要重新創建圖表,您有時也可以重用過濾器。