2012-03-30 90 views
0

我有一个程序接收网络摄像头视频,并使用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)). 

我不知道失败的原因或如何解决它。当这段代码是主线程中按钮的一部分时,它没有任何问题,但是当它单独进行线程处理时失败。

任何有关如何解决这个问题的帮助将不胜感激。

+0

某些COM对象具有线程关联。也许文件说明了一些事情。 – usr 2012-03-30 23:16:53

+0

问题在于'play.filesink =(IFileSinkFilter)play.file;''.file'引用的对象没有实现intefrace。错误消息告诉你这一点。 – 2012-03-31 09:13:39

回答

1

由于COM线程关联性问题,在一个线程中创建图并在另一个线程中控制该线程存在问题。

当您在按钮处理程序上使用代码块时,它的工作原理是因为一切都在同一个线程中执行。

解决您的问题的一个方法是,不是试图在处理线程上播放图形,而是发送用户定义的Windows消息,而是在实际播放图形的主线程中处理消息。

这将确保播放发生在创建图形的同一线程上。