使用directshowlib-2005查找视频的持续时间

时间:2010-09-01 13:18:22

标签: asp.net com directshow

我的asp.net(c#)方法如下所示:

    static public bool GetVideoLength(string fileName, out double length)
    {
        DirectShowLib.FilterGraph graphFilter = new DirectShowLib.FilterGraph();
        DirectShowLib.IGraphBuilder graphBuilder;
        DirectShowLib.IMediaPosition mediaPos;
        length = 0.0;

        try
        {
            graphBuilder = (DirectShowLib.IGraphBuilder)graphFilter;
            graphBuilder.RenderFile(fileName, null);
            mediaPos = (DirectShowLib.IMediaPosition)graphBuilder;
            mediaPos.get_Duration(out length);

            return true;
        }
        catch
        {
            return false;
        }
        finally
        {
            mediaPos = null;
            graphBuilder = null;
            graphFilter = null;
        }
    }

我用上面的方法得到了持续时间。但我的问题是我无法删除物理文件 我的手术后。我用了

File.Delete(文件路径);

执行此操作时,我得到如下例外:

“该进程无法访问该文件,因为该文件正由另一个进程使用。”

我的Os是Windows 7(IIS 7)

有人请帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我没有使用C#编写directshow应用程序的经验,但在C ++方面有丰富的经验。

DirectShow基于一种名为COM的技术 - 它使用引用计数来告诉它何时使用对象。

例如,它将使用COM对象来表示IGraphBuilder。

在C ++中,我们必须通过删除所有过滤器来解构图形,然后释放图形。

我知道C#有自己的垃圾收集等,但除非你明确释放你使用的对象,否则它们将保留在内存中。

从您引用的代码看来,即使播放可能已完成,图表仍会打开。在这种情况下,它会保留对您播放的文件的引用,这可以解释为什么您无法删除它 - 例如文件上有一个读锁定。

希望这能指出你正确的方向!