Поиск продолжительности видео с использованием directshowlib-2005 - PullRequest
2 голосов
/ 01 сентября 2010

Мой метод 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 (FilePath);

При выполнении этого действия я получил следующее исключение:

"Процесс не может получить доступ к файлу, поскольку он используется другим процессом."

Мой ОС - Windows 7 (IIS 7)

Кто-нибудь, пожалуйста, помогите мне разобраться с этим?

1 Ответ

1 голос
/ 14 октября 2010

У меня нет опыта в кодировании приложений DirectShow на C #, но большой опыт в C ++.

DirectShow основан на технологии COM, которая использует подсчет ссылок, чтобы определить, когда используется объект.

Например, для представления IGraphBuilder будет использоваться COM-объект.

В C ++ нам пришлось бы деконструировать граф, удалив все его фильтры, а затем освободить граф.

Я понимаю, что в C # есть своя собственная сборка мусора и т. Д., Но если вы явно не освободите используемые вами объекты, они останутся в памяти.

Из приведенного вами кода видно, что график все еще открыт, хотя воспроизведение, возможно, закончилось. В этом случае он будет содержать ссылку на файл, который вы воспроизвели, что объясняет, почему вы не можете удалить его - например, файл заблокирован от чтения.

Надеюсь, это направит вас в правильном направлении!

...