2010-12-10 107 views
3

我想改变默认的网络摄像头分辨率在C#中使用DirectShowNet,从我收集我需要改变它调用内置在Windows中的VideoInfoHeader类win32 api DLL为AVI捕获。我有以下代码从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(介质); 它说,人力资源小于0,所以引发此错误:一个接口有太多的方法来触发事件(异常从HRESULT:0x80040209)

它不会读取VideoInfoHeader位,所以我不能改变摄像头捕获的分辨率,任何人都知道更好的方法来做到这一点或如何解决这个问题?

+0

获取相机支持的分辨率列表:http://stackoverflow.com/questions/20414099/videocamera-get-supported-resolutions/20418718#20418718 – Vijayaraghavan 2016-05-20 07:47:01

回答

3

确保在查找人力资源错误代码时,请使用DirectShow Error and Success Code list查找它们,而不是通用HR代码列表。您将从该列表中看到0x80040209的实际含义为:

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

看起来您的图形没有连接您的采样器过滤器。请确保将您的呼叫中的采样器传递给RenderStream

+0

事情是我无法将我的采样卡传递给RenderStream,它期望一个IbaseFilter,所以我将我的采样器转换为IBasefilter,并尝试用上面的代码替换上述代码中的mux变量,但是这个mux变量来自SetOutFileName()调用的OUT,所以我必须使用它,你知道吗?怎么办? – James 2010-12-11 10:28:32

+1

通过采样器作为中间过滤器('null'参数)。 – heavyd 2010-12-11 20:06:19

0

更改网络摄像头分辨率的正确方法是查询其输出引脚IAMStreamConfig接口。它可以列出可用的格式和分辨率并选择一个。如果您运行GraphEditPlus并右键单击相机过滤器的输出引脚,您将能够看到该列表并选择分辨率。然后你可以生成代码(通过文件菜单),看看它是如何在C#中完成的。