我有一個程序接收網絡攝像頭視頻,並使用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