我有一个程序接收网络摄像头视频,并使用directshowlib-2005.dll在C#应用程序上显示它。需要帮助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)).
我不知道失败的原因或如何解决它。当这段代码是主线程中按钮的一部分时,它没有任何问题,但是当它单独进行线程处理时失败。
任何有关如何解决这个问题的帮助将不胜感激。
某些COM对象具有线程关联。也许文件说明了一些事情。 – usr 2012-03-30 23:16:53
问题在于'play.filesink =(IFileSinkFilter)play.file;''.file'引用的对象没有实现intefrace。错误消息告诉你这一点。 – 2012-03-31 09:13:39