我有一个接收网络摄像头视频的程序,并使用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);
其中play类是将传入视频从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 :(得分:1)
由于COM线程关联性问题,在一个线程中创建图形并在另一个线程中控制它存在问题。
当您在按钮处理程序上使用代码块时,它起作用,因为所有内容都在同一个线程中执行。
解决您的问题的方法之一是,而不是尝试在您的处理线程上播放图形,而是发送用户定义的Windows消息,然后处理实际播放图形的主线程中的消息。
这将确保在创建图形的同一线程上进行回放。