2012-03-30 3 views
0

У меня есть программа, которая получает видео с веб-камеры и отображает ее на C# -приложении, используя directshowlib-2005.dll.Нужна помощь с InvalidCastException

В моем приложении я также использую 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, а затем устанавливает оба потоковые и записывающие графики

файл является файловым файлом фильтра. Я конвертирую файл в 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)). 

Я не знаю, почему он не может или как это исправить. У него не было проблем, когда этот блок кода был частью кнопки в основном потоке, но когда его резьба по отдельности не срабатывает.

Любая помощь в том, как исправить это, будет оценена по достоинству.

+0

Некоторые COM-объекты имеют сходство нитей. Возможно, документация говорит об этом. – usr

+0

Проблема в строке 'play.filesink = (IFileSinkFilter) play.file;' Объект, на который ссылается '.file', не реализует intefrace. Сообщение об ошибке сообщает вам именно об этом. –

ответ

1

Есть проблемы с созданием графика в одном потоке и контролем его в другом потоке из-за проблем с присоединением потока COM.

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

Одна из проблем вашей проблемы - вместо того, чтобы пытаться воспроизвести график в потоке обработки, вместо этого отправляйте пользовательское окно с окнами, обрабатывая сообщение в основном потоке, где вы фактически играете на графике.

Это гарантирует, что воспроизведение происходит в том же потоке, который создал граф.