2010-12-10 30 views
3

C#でDirectShowNetを使用してデフォルトのWebカメラの解像度を変更しようとしていますが、WindowsのVideoInfoHeaderクラスを呼び出すことから変更する必要があります。 。私はDirectShowNetから次のコードを持っている:C#でビデオキャプチャの解像度を変更できない#

 hr = capGraph.SetFiltergraph(graphBuilder); 
     if(hr < 0) 
      Marshal.ThrowExceptionForHR(hr); 

     AMMediaType media = new AMMediaType(); 
     media.majorType = MediaType.Video; 
     media.subType = MediaSubType.RGB24; 
     media.formatType = FormatType.VideoInfo;  // ??? 
     hr = sampGrabber.SetMediaType(media); 
     if (hr < 0) 
      Marshal.ThrowExceptionForHR(hr); 

     hr = graphBuilder.AddFilter(capFilter, "Ds.NET Video Capture Device"); 
     if(hr < 0) 
      Marshal.ThrowExceptionForHR(hr); 

     DsUtils.ShowCapPinDialog(capGraph, capFilter, this.Handle); 

     Guid sub = MediaSubType.Avi; 
     hr = capGraph.SetOutputFileName(ref sub, fileName, out mux, out sink); 
     if(hr < 0) 
      Marshal.ThrowExceptionForHR(hr); 

     Guid cat = PinCategory.Capture; 
     Guid med = MediaType.Video; 
     hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, mux); // stream to file 
     if(hr < 0) 
      Marshal.ThrowExceptionForHR(hr); 


     media = new AMMediaType(); 
     hr = sampGrabber.GetConnectedMediaType(media); 
     if (hr < 0) 
      Marshal.ThrowExceptionForHR(hr); 
     if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero)) 
      throw new NotSupportedException("Unknown Grabber Media Format"); 

     videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader)); 
     Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero; 

シングは、私はこのためにラインでvideoInfoHeaderにアクセスすることはできませんです。HR = sampGrabber.GetConnectedMediaType(メディア) (HRESULTからの例外:0x80040209)

私は変更できないようにVideoInfoHeaderビットを読み取ることはありませんウェブカメラのキャプチャの解像度は、誰でもこれを行うための良い方法やこれを修正する方法を知っていますか?

+0

カメラでサポートされている解像度のリストを取得する:http://stackoverflow.com/questions/20414099/videocamera-get-supported-resolutions/20418718#20418718 – Vijayaraghavan

答えて

3

HRエラーコードを検索するときは、汎用HRコードリストではなくDirectShow Error and Success Code listを使用して検索してください。あなたは0x80040209の実際の意味は、そのリストから表示されます:あなたのグラフはあなたのサンプルグラバフィルタを接続していないよう

VFW_E_NOT_CONNECTED The operation cannot be performed because the pins are not connected.

が見えます。電話でにサンプルグラバーを渡してください。

+0

私はサンプルグラバーをRenderStreamに渡すことはできません。 IbaseFilterを期待しているので、サンプルグラバーをIBasefilterにキャストして、上記のコードでmux変数を置き換えようとしますが、mux変数はSetOutFileName()コールから出てきますので、使用する必要があります。道の周りに? – James

+1

サンプルグラバーを中間フィルター( 'null'パラメーター)として渡します。 – heavyd

0

Webカメラの解像度を変更する正しい方法は、出力ピンIAMStreamConfigインターフェイスを照会することです。利用可能なフォーマットと解像度をリストし、1つを選択することができます。 GraphEditPlusを実行し、カメラフィルタの出力ピンを右クリックすると、そのリストが表示され、解像度を選択できます。次に、(ファイルメニューを使用して)コードを生成し、C#でどのように処理されているかを確認できます。