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