2012-03-30 20 views
0

webcamビデオを受信し、directshowlib-2005.dllを使用してC#アプリケーションに表示するプログラムがあります。InvalidCastExceptionの支援が必要

私のアプリケーションでは、GMFBridgeを使用して、指示されたときにビデオをストリーミングして記録できるようにしています。

このプログラムでは、私のアプリケーションコントロールはメインループにあり、ビデオストリーミングは別のスレッドで行われます。演劇クラスは、YUVからRGBへの着信ビデオを変換したクラスで、次に設定どこ

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); 

両方:私はボタンを押して使用することにより、メインスレッドから現在のストリーミングビデオを録画のいずれかのオプションを持っていますストリーミング、録音グラフ

ファイルはフィルタファイル作成者です。 2行目に示すように、ファイルの書き込みを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); 

を、これは、スレッド内で発生し、記録があった場合にアプリケーションは1行目および/または2行目でクラッシュします。エラーは同じで、1行目と2行目の両方の呼び出しで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

+0

問題は 'play.filesink =(IFileSinkFilter)play.file;'行にあります。 '.file'によって参照されるオブジェクトはintefraceを実装しません。エラーメッセージは正確にこれを示しています。 –

答えて

1

あるスレッドでグラフを作成し、COMスレッド類似性の問題が原因で別のスレッドでグラフを制御する際に問題があります。

ボタンハンドラでコードブロックを使用していたとき、すべてが同じスレッドで実行されたため、コードブロックが機能しました。

問題を解決する方法の1つは、処理スレッドでグラフを再生し、代わりにユーザー定義のWindowsメッセージを送信し、実際にグラフを再生するメインスレッドでメッセージを処理することです。

これにより、グラフが作成された同じスレッドで確実に再生されます。

関連する問題