我想改变默认的网络摄像头分辨率在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位,所以我不能改变摄像头捕获的分辨率,任何人都知道更好的方法来做到这一点或如何解决这个问题?
获取相机支持的分辨率列表:http://stackoverflow.com/questions/20414099/videocamera-get-supported-resolutions/20418718#20418718 – Vijayaraghavan 2016-05-20 07:47:01