0

この問題の解決策を見つけるのに 4 時間近く費やしました。基本的に、Web カメラからのビデオを表示し、スナップショットを取り、Web カメラの解像度を変更できるDirectShowNetを使用して、C# でアプリケーションを作成しています。ウェブカメラのプラグが抜かれ、再び差し込まれたことを検出するデバイス マネージャーがあります。

最初に、FilterGraph オブジェクトを作成し、それを IFilterGraph3 にキャストします。次に、次の呼び出しを行います。

graphBuilder.AddSourceFilterForMoniker(deviceMoniker, null, deviceName, out sourceFilter)

この呼び出しは、最初にアプリケーションを起動したときに機能し、グラフを破棄して新しいグラフを作成した場合でも機能します。ただし、デバイスが再び接続された後にグラフを作成しようとするときだけは機能しません。

1 台のマシン (Win8 x64) で、次のエラーが表示されます。

REGDB_E_CLASSNOTREG - 0x80040154 - Class not registered

別のマシン (Win7 x64) で、次のエラーが表示されます。

REGDB_E_IIDNOTREG - 0x80040155 - Interface not registered

このコードをAny CPUおよびx86としてビルドする両方をテストしました。また、他のマシンでテストしましたが、OS とは関係なく、まだInterface not registeredエラーが発生します。Logitech C920Microsoft LifeCam Studioの両方を使用してみました。どちらも同じエラーになります。IMoniker メソッドを使用して、別の方法も試しました。

deviceMoniker.BindToObject(null, null, ref baseFilterId, out source);

同じエラーが発生します。デバイスが切断された後、グラフがソース (Webcam フィルター) を適切に取得できるようにクリーンアップしていないことが残っているように感じます。どんなアイデアでも大歓迎です。

一般的な HRESULT エラー コードは、 COM エラー コード (汎用)で確認できます。

4

1 に答える 1

2

つまり、基本的には、ある朝起きて仕事に取り掛かり、コードをじっと見つめて、「待って、これが機能しない理由はわかっている...」と言いました。これはスレッド化の問題です。私が作成していた最初のグラフは、後で作成しようとしていたグラフとは別のスレッドにありました。そのため、グラフを再作成したときにのみ発生します。

アプリケーションが既に開始された後にIVideoWindow's put_Ownerデバイスが接続されたときの方法にも問題がありました。この場合、デバイスは実行中に取り外されず、put_Owner はそのメソッドを実行しようとしてフリーズ/デッドロックしました。

全体として、を使用してデバイスのプラグが抜かれた/差し込まれたことを検出するスレッドがありますDsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)。そのため、これらのグラフを作成しようとすると、他のグラフが最初に作成されたメイン UI スレッドにはありません。Action<Action> invokerこれを解決するために、メソッド ラッパーを提供できるデバイス テイクを処理するクラスを用意しました。この場合、Control.Invokeデバイス監視スレッドの呼び出しが UI スレッド内のこの呼び出し側メソッドによってラップされるように、WinForms フォームから渡します。グラフ作成の問題を完全に解決しました。

これまで誰もこれに遭遇したことがないことに、私は非常に驚いています。このエラーに関連する問題について話し合うときに、スレッド化について言及している人を他に見つけることができませんでした。非常に奇妙な。

于 2013-08-12T17:34:31.757 に答える