directshow问题

时间:2011-04-07 01:30:44

标签: c# directshow

我正在使用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);

实际上我发现当我拔掉网络物理并再次插入时,问题就消失了,所以我得出结论,我需要使用代码拔掉它 所以,如果你知道告诉我该怎么做或者你有什么好主意请告诉我

您可以访问原始代码 http://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2FKB%2Fdotnet%2FROTEsys%2Frotesys_src.zip&zep=Tracking.cs&obid=9401&obtid=2&ovid=1 [^]

谢谢你的时间和耐心

3 个答案:

答案 0 :(得分:1)

一次只能运行一个视频源的图表,将其视为具有单一来源的管道。

如果你想开始另一个图表,你必须先停止第一个图表 - 你的代码目前在CloseInterfaces();中执行 - 所以如果你在构建第二个图表之前调用它,你应该没问题。< / p>

答案 1 :(得分:1)

问题可能出在你关闭界面时,你必须在DirectShow的所有界面中使用Marshal.ReleaseComObject,而且你必须使用RemoveFilter的方法IGraphBuilder如果不这样做,则重新启动已使用的捕获过滤器,不会释放图形构建器。

答案 2 :(得分:0)

是的,在CloseInterfases()方法中,添加以下行:

if (graphBuilder != null)
{
    graphBuilder.RemoveFilter(capFilter);
}
baseGrabFlt = null;