トップ回答者
一つのアプリで複数のカメラから画像取得したい

質問
-
お世話になります。
C#で下記のサンプルで再度トライしようと思いますが、いくつか質問があります。
「ストリーム形式のプロパティ」や「画像補正系のプロパティ」などもあるhttp://mobiquitous.com/programming/usbcamera.html のサンプルを参考にしています。
そこで、作りながらテストして挙動など見ていたのですが、このカメラって複数台同時に動かないのでしょうか?
タブレットに前後に計台カメラが付いているので試しに
dsCapture1 = new DSCapture(this, this.videoPanel, 0); dsCapture2 = new DSCapture(this, this.videoPanel2, 1); if (!dsCapture1.isActive || !dsCapture2.isActive) this.Dispose();
のようにしてやってみたら
「ビデオストリームを正常に読み込めません
System.Runtime.InteropServices.COMException(0x800705AA):システムリソースが不足しているため、要求されたサービスを完了できません。(HRESULTからの例外)・・
場所
System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(・・・)
・・・
DirectShowTest.DSCapture.InitVideo(UCOMIMoniker moniker)
」と出ます。下側がメッセージを出しており、上は通常通りに表示しています。
もう一つ質問があり、ビデオ撮影中(キャプチャ―でなく撮影保存しながら)にそこから静止画を保存したいのですが、可能でしょうか?
このサンプルでは、ボタンを使用不可にしていますが、1つのスレッドであっちもこっちもは不可能なんですか?長文になりましたが、アドバイスいただけるとありがたいです。
Windows7/8 C# Winアプリ VS2010
回答
-
そのリンク先からダウンロードしたソースをビルドしてみました。
DSCaptureの引数を変えてビルドした2つの実行ファイルをつくって、同時に実行させてみましたが、同様のエラーが出ます。
1つのアプリでどころか別プロセスにしても同時使用できないという事になります。同じプロジェクトのものなのか不明ですが、http://sourceforge.net/projects/directshownet/files/からサンプルを落としてきて試すと同時使用できました。他にもOpenCVのサンプルでも同時使用できました。
システムリソースというエラー内容からカメラデバイス自体が物理的に同時使用できないのか、バスの転送速度が不足しているのかとも思いましたが、そういう理由ではなさそうです。リンク先のに含まれているDShowNet.dllのビルド日時を見るとかなり古く、2003年というNet1.1の頃に作られたようです。
DShowNet.dll(1.0.0.1)のコードが無いので調べてないですが、このライブラリ自体がそもそも同時使用に耐えられないのではないでしょうか?
#別スレッドからコントロール操作してる例外が頻発するので、サンプルの質がいまいちなせいの可能性もありますがDirectShowの知識はほとんどないのですが、録画しながら静止画取り出しは、DirectShow にて特定のフレームの静止画を取得するという例がありますね。(画像のグラフにフレームを取り込めるフィルターを作って挿入する方法でもできるかも)
なんにせよ、前の質問でAzuleanさんが回答しているようにC++,COM,DirectShowの知識が必須ですね。個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク ferret001 2015年3月16日 0:57
すべての返信
-
そのリンク先からダウンロードしたソースをビルドしてみました。
DSCaptureの引数を変えてビルドした2つの実行ファイルをつくって、同時に実行させてみましたが、同様のエラーが出ます。
1つのアプリでどころか別プロセスにしても同時使用できないという事になります。同じプロジェクトのものなのか不明ですが、http://sourceforge.net/projects/directshownet/files/からサンプルを落としてきて試すと同時使用できました。他にもOpenCVのサンプルでも同時使用できました。
システムリソースというエラー内容からカメラデバイス自体が物理的に同時使用できないのか、バスの転送速度が不足しているのかとも思いましたが、そういう理由ではなさそうです。リンク先のに含まれているDShowNet.dllのビルド日時を見るとかなり古く、2003年というNet1.1の頃に作られたようです。
DShowNet.dll(1.0.0.1)のコードが無いので調べてないですが、このライブラリ自体がそもそも同時使用に耐えられないのではないでしょうか?
#別スレッドからコントロール操作してる例外が頻発するので、サンプルの質がいまいちなせいの可能性もありますがDirectShowの知識はほとんどないのですが、録画しながら静止画取り出しは、DirectShow にて特定のフレームの静止画を取得するという例がありますね。(画像のグラフにフレームを取り込めるフィルターを作って挿入する方法でもできるかも)
なんにせよ、前の質問でAzuleanさんが回答しているようにC++,COM,DirectShowの知識が必須ですね。個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク ferret001 2015年3月16日 0:57
-
gekka様、お世話になります。
サンプルを確認していただきありがとうございます。DLLそのものが対応していないのですね。考えてもいませんでした。
教えていただいたサンプルをもとにもう一度やり直します。特定の動画についてのサンプル提示もありがとうございます。
以前の回答でもあった、C++, COM, DirectShowは、VC++MFCをC#の前にやっていたのでまだ、覚えていると思います。
COMは経験なし、DirectShowはMFCから呼ぶには不向き(処理が深くて遅いため)だったので、横目で見ていただけ。
せっかくの機会なので、もうちょっと頑張ってみます。