如何使用Delphi / DSPack捕获帧而不在TVideoWindow上显示它?

时间:2012-10-01 20:31:07

标签: delphi directshow dspack

DSpack具有示例代码,用于播放与DirectShow兼容的视频设备并同时捕获视频帧。 TVideoWindow附加到FilterGraph以显示视频(Firgure-1)。如果删除TVideoWindow,则操作系统(Windows)将自动调出ActiveMovie并在单独的窗口中显示视频(图2)。

有没有办法在不使用任何GUI组件且不显示视频的情况下使用DSPack捕获视频帧?

DSPack论坛有一些关于NullRenderer过滤器的提及,但没有关于如何使用它的文档或示例。看起来我们可以实现这一点,如果我们直接在GraphEdit中用Null Render手动替换Video Renderer(图3)。

我们如何通过在代码中进行所有操作来实现图3中所示的结果? DSPack没有解释如何创建Null渲染器。

Figure-1: The graph of the default example code

Figure-1

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

Figure-2

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

Figure-3

这就是我最终做的事情(到目前为止)

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;

1 个答案:

答案 0 :(得分:6)

Null Renderer Filter是标准过滤器/类。在代码中,您只需要实例化它(CoCreateInstance),将其添加到图形中,并将其输入引脚连接到Sample Grabber的未连接输出引脚。

在Delphi / DSPack中它应该是这样的:

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;

相关问题