如何使用Delphi/DSPack捕获帧而不将其显示在TVideoWindow上?
-
12-12-2019 - |
题
DSpack 具有播放 DirectShow 兼容视频设备并同时捕获视频帧的示例代码。TVideoWindow 附加到 FilterGraph 以显示视频 (Figure-1)。如果删除 TVideoWindow,则操作系统 (Windows) 将自动启动 ActiveMovie 并在单独的窗口上显示视频(图 2)。
有没有一种方法可以使用 DSPack 捕获视频帧而不使用任何 GUI 组件且不显示视频?
DSPack 论坛有一些关于 NullRenderer 过滤器的提及,但没有关于如何使用它的文档或示例。看起来如果我们直接在 GraphEdit 中手动将视频渲染器替换为 Null Render,我们就可以实现这一点(图 3)。
我们如何通过在代码中进行所有操作来获得图 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;
解决方案
Null Renderer Filter
是一个标准过滤器/类。在代码中你只需要实例化它(CoCreateInstance
),将其添加到图表中,并将其输入引脚连接到样本采集器未连接的输出引脚。
在 Delphi/DSPack 中应该是这样的:
Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
不隶属于 StackOverflow