我有一个使用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
答案 0 :(得分:1)
最终,图形是一组连接的COM对象,成功的图形终止取决于正确的版本,没有任何泄漏的引用。您可能未发布的引用会导致对象保持活动状态并可能锁定某些资源。
您可以做的最好是明确终止/删除单个对象:
IFilterGraph2.RemoveFilter
如果发生泄漏,图表不应再引用资源。请注意,如果要重新创建图形,有时也可以重复使用过滤器。