本文介绍了在C#中使用GMFPreview添加ISampleGrabber过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述





我有以下代码使用GMFPreview桥捕获和预览。它的工作正常。现在我需要添加样本Grabber过滤器,以便我可以使用SetMode函数捕获图像并行而不会出现任何故障。请告诉我如何在此块中添加样本抓取器过滤器。



我尝试了很多但无法实现。请帮忙,因为我是新手。



Hi,

I have below code to capture and preview using GMFPreview bridge. Its working fine. Now i need to add sample Grabber filter so that i can capture image parallel without any glitch using SetMode function. Please let me know how to add sample grabber filter in this block.

I tried a lot but not able to achieve. Please help as i am new to this.

// Specify a device, and a window to draw the preview in
   public void
   SelectDevice(DsDevice dev, IntPtr hwnd)
   {
       int hr;
       IBaseFilter pfDevice = null;
       ICaptureGraphBuilder2 pBuilder = null;

       try
       {
           // create source graph and add sink filter
           m_pSourceGraph = (IGraphBuilder)new FilterGraph();
           m_rot1 = new DsROTEntry(m_pSourceGraph);

           m_pBridge = (IGMFBridgeController)new GMFBridgeController();

           // init to video-only, in discard mode (ie when source graph
           // is running but not connected, buffers are discarded at the bridge)
           hr = m_pBridge.AddStream(true, eFormatType.MuxInputs, true);
           DsError.ThrowExceptionForHR(hr);

           // Add the requested device
           hr = ((IFilterGraph2)m_pSourceGraph).AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out pfDevice);
           DsError.ThrowExceptionForHR(hr);


           // Add the sink filter to the source graph
           hr = m_pBridge.InsertSinkFilter(m_pSourceGraph, out m_pSourceGraphSinkFilter);
           DsError.ThrowExceptionForHR(hr);

           // use capture graph builder to render preview
           pBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

           // Init the CaptureGraphBuilder2
           hr = pBuilder.SetFiltergraph(m_pSourceGraph);
           DsError.ThrowExceptionForHR(hr);

           // Connect the filters together to allow preview
           hr = pBuilder.RenderStream(PinCategory.Preview, MediaType.Video, pfDevice, null, null);
           DsError.ThrowExceptionForHR(hr);

           // connect capture output to the pseudo-sink filter,
           // where it will be discarded until required
           hr = pBuilder.RenderStream(PinCategory.Capture, MediaType.Video, pfDevice, null, m_pSourceGraphSinkFilter);
           DsError.ThrowExceptionForHR(hr);


           // turn off capture stream if possible except when capturing
           hr = pBuilder.FindPin(pfDevice, PinDirection.Output, PinCategory.Capture, MediaType.Video, false, 0, out m_pCapOutput);
           if (hr >= 0)
           {
               IAMStreamControl pSC = (IAMStreamControl)m_pCapOutput;
               pSC.StartAt(NEVER, 0);  // Ignore any error
           }


           ConfigureVideo(hwnd);

           IMediaControl pMC = (IMediaControl)m_pSourceGraph;

           hr = pMC.Run();
           DsError.ThrowExceptionForHR(hr);

           // If we made it here, the device is selected
           m_DeviceSelected = true;
       }
       catch
       {
           ReleaseSelectMembers();
           throw;
       }
       finally
       {
           if (pBuilder != null)
           {
               Marshal.ReleaseComObject(pBuilder);
           }

           if (pfDevice != null)
           {
               Marshal.ReleaseComObject(pfDevice);
           }

           Saved_m_pSourceGraph = m_pSourceGraph;
       }
   }

推荐答案

m_sampleGrabber = (ISampleGrabber)new SampleGrabber();                   
SetupSampleGrabber(m_sampleGrabber);
hr = m_pSourceGraph.AddFilter(m_sampleGrabber as IBaseFilter, "SampleGrabber");
DsError.ThrowExceptionForHR(hr);





类似的东西



Something like that


这篇关于在C#中使用GMFPreview添加ISampleGrabber过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 23:34