我正在使用DirectShow.net从webCame中捕获图像,在搜索网页后我得到了这个代码并且工作正常:
要查看原始完整代码,请点击以下链接
bool SetupGraph() { int hr; try { hr = capGraph.SetFiltergraph(graphBuilder); 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); 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(baseGrabFlt, "Ds.NET Grabber"); if (hr < 0) Marshal.ThrowExceptionForHR(hr); Guid cat = PinCategory.Preview; Guid med = MediaType.Video; hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, null); // baseGrabFlt if (hr < 0) Marshal.ThrowExceptionForHR(hr); cat = PinCategory.Capture; med = MediaType.Video; hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, baseGrabFlt); // baseGrabFlt 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("صيغه غير معروفه"); videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader)); Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero; hr = sampGrabber.SetBufferSamples(false); if (hr == 0) hr = sampGrabber.SetOneShot(false); if (hr == 0) hr = sampGrabber.SetCallback(null, 0); if (hr < 0) Marshal.ThrowExceptionForHR(hr); return true; } catch (Exception ee) { MessageBox.Show(this, "Could not setup graph\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop); return false; } }
我的问题是,当我第二次从另一个表单调用此表单时,它给出了这个错误:"Value does not fall within the expected range"
当编译器出现在本节时:
hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, null);
实际上我发现当我拔掉网络物理并再次插入时,问题就消失了,所以我得出结论,我需要使用代码拔掉它 所以,如果你知道告诉我该怎么做或者你有什么好主意请告诉我
谢谢你的时间和耐心
答案 0 :(得分:1)
一次只能运行一个视频源的图表,将其视为具有单一来源的管道。
如果你想开始另一个图表,你必须先停止第一个图表 - 你的代码目前在CloseInterfaces();
中执行 - 所以如果你在构建第二个图表之前调用它,你应该没问题。< / p>
答案 1 :(得分:1)
问题可能出在你关闭界面时,你必须在DirectShow的所有界面中使用Marshal.ReleaseComObject
,而且你必须使用RemoveFilter
的方法IGraphBuilder
如果不这样做,则重新启动已使用的捕获过滤器,不会释放图形构建器。
答案 2 :(得分:0)
是的,在CloseInterfases()方法中,添加以下行:
if (graphBuilder != null)
{
graphBuilder.RemoveFilter(capFilter);
}
baseGrabFlt = null;