如何用Delphi / DSPACK不会对TVideoWindow显示其拍摄帧?(How to ca

2019-09-23 07:27发布

DSPACK具有示例代码玩一个DirectShow兼容的视频设备和同时捕获的视频帧。 甲TVideoWindow附接到FilterGraph动态显示视频(Firgure-1)。 如果删除TVideoWindow,那么操作系统(Windows)将自动弹出ActiveMovie和一个单独的窗口(如图2)显示视频。

有没有办法使用DSPACK捕获视频帧,而无需使用任何GUI组件,并且不显示视频的方法吗?

DSPACK论坛有一些提及关于NullRenderer过滤器,但没有对如何使用它没有文档或实例。 看起来我们可以做到这一点,如果我们手动空替换视频渲染器直接在GraphEdit中(如图3)渲染。

我们怎样才能achive通过执行码内的所有操作图-3所示的结果? DSPACK没有解释如何创建一个空渲染器。

Figure-1: The graph of the default example code

Figure-2: Shows what happens if I remove the TVideoWindow

Figure-3: Shows what happens if I replace Video Renderer with a 
         Null Renderer and manually connect them in the GraphEdit. 

这是我落得这样做(到目前为止)

请拨打以下ReassignSampleGrabberOutput之前filterGraph.Play;

procedure TForm1.ReassignSampleGrabberOutput;
var
  nullRenderer : IBaseFilter;
  nullRendererPins: IEnumPins;
  nullRendererPin : IPin;
  graph:   IGraphBuilder;
begin

  nullRenderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
  FilterGraph1.QueryInterface(IID_IGraphBuilder, graph);
  graph.AddFilter(nullRenderer, 'Null Renderer');

  nullRenderer.EnumPins(nullRendererPins);

  nullRendererPins.Reset;

  if nullRendererPins.Next(1, nullRendererPin, nil) = S_OK then
  begin
    //SampleGrabber1.OutPutPin.Disconnect;
    //SampleGrabber1.OutPutPin.Connect(nullRendererPin, nil);

    graph.Disconnect(SampleGrabber1.OutPutPin);
    graph.FindFilterByName('Video Renderer', filter);
    graph.RemoveFilter(filter);
    graph.Connect(SampleGrabber1.OutPutPin, nullRendererPin);

  end;
end;

Answer 1:

Null Renderer Filter是一个标准过滤器/类。 在代码中,你只需要初始化它( CoCreateInstance ),将其添加到图形,它的输入引脚连接到样品采集卡的未连接输出引脚。

在Delphi / DSPACK它应该是这样的:

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;



文章来源: How to capture frames using Delphi/DSPack without displaying it on TVideoWindow?