我正在尝试使用 C# 中的 DirectShowNet 更改默认网络摄像头分辨率,据我所知,我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获。我有来自 DirectShowNet 的以下代码:
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(media);
它说 hr 小于 0,因此抛出此错误:接口有太多方法可以触发事件(来自 HRESULT 的异常:0x80040209)
它不会读取 VideoInfoHeader 位,因此我无法更改网络摄像头捕获的分辨率,有人知道更好的方法来执行此操作或如何解决此问题吗?
确保在查找 HR 错误代码时使用DirectShow 错误和成功代码列表 http://msdn.microsoft.com/en-us/library/ms783645%28VS.85%29.aspx,而不是通用 HR 代码列表。您将从该列表中看到 0x80040209 的实际含义是:
VFW_E_NOT_CONNECTED 由于引脚未连接,因此无法执行操作。
看起来您的图表没有连接您的样本采集器过滤器。确保在调用中将样本采集器传递给RenderStream http://msdn.microsoft.com/en-us/library/aa930715.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)