需要InvalidCastException的帮助

本文关键字:帮助 InvalidCastException 需要 | 更新日期: 2023-09-27 18:29:30

我有一个程序,可以接收网络摄像头视频,并使用directshowlib-2005.dll在C#应用程序上显示。

在我的应用程序中,我还使用了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)).

我不知道它为什么会失败,也不知道如何修复。当这段代码是主线程中按钮的一部分时,它没有问题,但当它单独线程时,它会失败。

如有任何关于如何解决此问题的帮助,我们将不胜感激。

需要InvalidCastException的帮助

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

当您在按钮处理程序上使用代码块时,它是有效的,因为所有内容都在同一个线程中执行。

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

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