Windows7のVB.NET2008、WebカメラはLogicoolのQcamで質問です。


VisualBasicからWebカメラの撮影を行いたいと考えています。
検索してみるとこのような時はDirectShowを使うようなので、たとえば以下のサイトを参考にしてみました。

How to capture a single frame from the video stream?
http://forum.codecall.net/visual-basic-programming/26242-how-capture-single-frame-video-stream.html

しかし、FindCaptureDevice()のmoniker(0).BindToObject(Nothing, Nothing, iid, source)内で"指定されたキャストは有効ではありません。"という例外が発生します。
他のサンプルコードを参考にした場合でも大体同じ個所で例外が発生する為、進まずに困っています。

考えられる対処案について詳しい方、宜しくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/11/19 14:46:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:yossiy7 No.1

回答回数778ベストアンサー獲得回数96

ポイント35pt

ちゃんとPlatformSDKはインストールしていますか?

あと、フィルタは何を使ってますか?

id:halohalolin

yossiy7さんありがとうございます。

 

1.PlatformSDKについて

下記のページによる解説ですと、VisualStudio2008ではPlatformSDKでなく、Windows SDKの6.0Aのサブセットで何とかするそうです。

http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread...

VS2008インストールでVC/PlatformSDKが存在しない

Windows SDKの6.0Aは、C:\Program Files\Microsoft SDKs\Windows\v6.0Aに入っていました。

2.フィルタは何を使ってますか?

いま実装しようとしている処理は、キャプチャデバイスをソースフィルタに対応づける部分と考えているので、答えは「ソースフィルタ」となるのでしょうか?

2010/11/13 15:40:12
id:yossiy7 No.2

回答回数778ベストアンサー獲得回数96

ポイント35pt

PlatformSDKのソースをコンパイルする事で作成されるリンクライブラリはリンク済みでしょうか?

id:halohalolin

yossiy7さんありがとうございます。

先述の通り、私が扱っているのはVisualStudio2008ですので、Windows SDKの6.0Aのサブセットを使用することになります。

リンクライブラリは、VB.NETでは、参照を指摘して頂いていると思うのですが、何を追加すればよいのでしょうか?

自分なりに検索してみましたが、わかりませんでした。

 

なお、現在参照しているのは以下の通りです。

DirectShowLib-2005

DShowNET

Microsoft.DirectX.AudioVideoPlayback

[デフォルト]System

[デフォルト]System.Core

[デフォルト]System.Data

[デフォルト]System.Data.DataSetExtensions

[デフォルト]System.Deployment

[デフォルト]System.Drawing

[デフォルト]System.Windows.Forms

[デフォルト]System.Xml

[デフォルト]System.Xml.Linq

 

ちなみに、コメント欄にも記載しましたが、例外が発生する度に該当箇所を

http://www.geocities.co.jp/SiliconValley/7406/tips/dshow2005/dsh...

DirectShow関係3(VB2005)

 

この中の「3.2 サンプルグラバによる静止画取得」のソースコードへ置き換えていったら例外がおさまっています。

 

ただ、ソースコードが長くなり、且つこのソースが行っていることの意味がよくわからないという別の悩みが生まれています。

2010/11/15 16:45:04
  • id:halohalolin
    なお、私のコードの写し間違いかもしれませんので、前後のコードを記載します。
     
    Public Function FindCaptureDevice() As IBaseFilter
    Dim hr As Integer = 0
    Dim classEnum As IEnumMoniker = Nothing
    Dim moniker() As IMoniker = New IMoniker(0) {}
    Dim source As Object = Nothing
    Dim devEnum As ICreateDevEnum = CType(New CreateDevEnum, ICreateDevEnum)

    hr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, classEnum, 0)
    DsError.ThrowExceptionForHR(hr)
    Marshal.ReleaseComObject(devEnum)
    If classEnum.Next(moniker.Length, moniker, IntPtr.Zero) = 0 Then
    Dim iid As Guid = GetType(IBaseFilter).GUID
    moniker(0).BindToObject(Nothing, Nothing, iid, source)
    Else
    Throw New ApplicationException("Unable to access video capture device!")
    End If
    Marshal.ReleaseComObject(moniker(0))
    Marshal.ReleaseComObject(classEnum)

    Return CType(source, IBaseFilter)
    End Function
  • id:halohalolin
    自己解決しました。
    DirectShowLibやDShowNETといったDLLからDirectShowを利用することを考えていたのですが
     
    http://www.geocities.co.jp/SiliconValley/7406/tips/dshow2005/dshow2005_3.html
    DirectShow関係3(VB2005)
     
    今まで例外が発生した部分(たとえば、IBaseFilterの定義部分など)について、この中の「3.2 サンプルグラバによる静止画取得」のソースコードへ置き換えていったら例外がおさまりましたので、この方法で開発していきたいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません