Нужна помощь с InvalidCastException - PullRequest
0 голосов
/ 31 марта 2012

У меня есть программа, которая получает видео с веб-камеры и отображает его в приложении 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)).

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

Буду признателен за любую помощь, как это исправить.

1 Ответ

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

Существуют проблемы с созданием графа в одном потоке и управлением им в другом потоке из-за проблем схожести потоков COM.

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

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

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

...