У меня есть программа, которая получает видео с веб-камеры и отображает его в приложении C #, используя directshowlib-2005.dll.
В моем приложении я также использую GMFBridge, чтобы я мог передавать и записывать видео в любое время.
В этой программе мои элементы управления приложения находятся в основном цикле, а потоковое видео выполняется в отдельном потоке. У меня есть варианты записать текущее потоковое видео из основного потока, нажав кнопку и используя:
play.filesink = (IFileSinkFilter)play.file;
play.filesink.SetFileName(GetDateTimeString("Video") + ".avi", null);
IMediaControl Second_Graph = play.s_mediaCtrl;
Second_Graph.Run();
play.bridge.BridgeGraphs(play.BridgeSink, play.sourceFilter);
где класс воспроизведения - это класс, который преобразует входящее видео из yuv в rgb, а затем настраивает как потоковый, так и записывающий графики
file - это средство записи файла фильтра. Я преобразую запись файла в IFileSinkFilter, чтобы я мог поставить имя, как показано во второй строке. затем я играю, создаю медиа-контроллер, запускаю график и соединяю график потоковой передачи и записи.
У меня также есть возможность настроить будущие записи в более поздние времена и даты, как указано. Будущие записи вводятся и хранятся в статическом списке, который сортируется в зависимости от того, когда происходят записи. Внутри потокового потока я опрашиваю список, чтобы узнать, пора ли начинать запись, если я запускаю тот же код, что и выше:
play.filesink = (IFileSinkFilter)play.file;
play.filesink.SetFileName(GetDateTimeString("Video") + ".avi", null);
IMediaControl Second_Graph = play.s_mediaCtrl;
Second_Graph.Run();
play.bridge.BridgeGraphs(play.BridgeSink, play.sourceFilter);
Это происходит внутри потока, и при записи происходит сбой приложения в первой и / или второй строке. ошибка та же, она не знает, что такое IFileSinkFilter, поэтому при обоих вызовах в первой и второй строках происходит сбой.
Получена ошибка:
Unable to cast COM object of type 'System.__ComObject' to interface type 'DirectShowLib.IFileSinkFilter'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{A2104830-7C70-11CF-8BCE-00AA00A3F1A6}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
Я не уверен, почему это не помогает или как это исправить. У него не было проблем, когда этот блок кода был частью кнопки в главном потоке, но при отдельном потоке он не работал.
Буду признателен за любую помощь, как это исправить.