DirectShow内存无法正常释放

时间:2015-10-19 13:31:26

标签: c# memory marshalling directshow directshow.net

我使用directshow时遇到了内存问题,更具体地说,是directshow.net库

目标是复制AVI文件并且一切正常,除了在调用Marshal.ReleaseComObject之后内存根本不释放的事实。

我正在创建图表的几个步骤

  1. 创建IFilterGraph2对象
  2. 创建ICaptureGraphBuilder2
  3. 设置Filtergraph
  4. 使用IFilterGraph2.AddSourceFilter
  5. 添加源过滤器
  6. 创建和配置ISampleGrabber
  7. 添加ISampleGrabber
  8. 渲染流
  9. 此时,如果我从图表中删除过滤器并调用ISampleGrabber,IFilterGraph2和ICaptureGraphBuilder2上的Marshal.ReleaseComObject来释放,则内存仍然保留并且永不卸载。

    问题是,如果我在不关闭整个过程的情况下播放很多文件,我最终会收到来自Com Objects的80004001错误,这听起来有点奇怪

    提前感谢阅读和任何进一步的建议

    编辑:从directshow.net库示例添加代码,该代码具有相同的行为

        private void SetupGraph(Control hWin, string FileName)
        {
            int hr;
    
            // Get the graphbuilder object
            m_FilterGraph = new FilterGraph() as IFilterGraph2;
    
            // Get a ICaptureGraphBuilder2 to help build the graph
            ICaptureGraphBuilder2 icgb2 = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
    
            try
            {
                // Link the ICaptureGraphBuilder2 to the IFilterGraph2
                hr = icgb2.SetFiltergraph(m_FilterGraph);
                DsError.ThrowExceptionForHR( hr );
    
    
                // Add the filters necessary to render the file.  This function will
                // work with a number of different file types.
                IBaseFilter sourceFilter = null;
                hr = m_FilterGraph.AddSourceFilter(FileName, FileName, out sourceFilter);
                DsError.ThrowExceptionForHR( hr );
    
                // Get the SampleGrabber interface
                m_sampGrabber = (ISampleGrabber) new SampleGrabber();
                IBaseFilter baseGrabFlt = (IBaseFilter) m_sampGrabber;
    
                // Configure the Sample Grabber
                ConfigureSampleGrabber(m_sampGrabber);
    
                // Add it to the filter
                hr = m_FilterGraph.AddFilter( baseGrabFlt, "Ds.NET Grabber" );
                DsError.ThrowExceptionForHR( hr );
    
                // Connect the pieces together, use the default renderer
                hr = icgb2.RenderStream(null, null, sourceFilter, baseGrabFlt, null);
                DsError.ThrowExceptionForHR( hr );
    
                // Now that the graph is built, read the dimensions of the bitmaps we'll be getting
                SaveSizeInfo(m_sampGrabber);
    
                // Configure the Video Window
                IVideoWindow videoWindow = m_FilterGraph as IVideoWindow;
                ConfigureVideoWindow(videoWindow, hWin);
    
                // Grab some other interfaces
                m_mediaEvent = m_FilterGraph as IMediaEvent;
                m_mediaCtrl = m_FilterGraph as IMediaControl;
            }
            finally
            {
                if (icgb2 != null)
                {
                    Marshal.ReleaseComObject(icgb2);
                    icgb2 = null;
                }
            }
    
        }
    

0 个答案:

没有答案