2012-03-30 88 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消息,而是在實際播放圖形的主線程中處理消息。

這將確保播放發生在創建圖形的同一線程上。