DirectShow .Net AddSourceFilter Релиз файл - PullRequest
1 голос
/ 28 марта 2012

У меня есть приложение, которое воспроизводит видео с помощью 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

1 Ответ

1 голос
/ 29 марта 2012

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

Лучшее, что вы можете сделать, это явное завершение / удаление отдельных объектов:

  • Остановить график
  • Явно удалить все фитинги, используя IFilterGraph2.RemoveFilter
  • Использование вызовов методов, зависящих от фильтра, для возможного завершения отдельных фильтров, например, путем установки пустого пути к фильтрам источника / приемника файла

Если даже имеет место утечка, график больше не должен ссылаться на ресурсы.Обратите внимание, что иногда вы также можете повторно использовать фильтры, если заново создаете график.

...