Delphi 如何通过DsPack组件从视频文件中获取帧位图?

Delphi 如何通过DsPack组件从视频文件中获取帧位图?,delphi,screenshot,dspack,Delphi,Screenshot,Dspack,是否可以通过DsPack组件从视频文件中获取位图 在这种情况下,我使用的是这个代码;但它无法拍摄屏幕截图: type TForm4 = class(TForm) FilterGraph1: TFilterGraph; VideoWindow1: TVideoWindow; btnPlay: TButton; SampleGrabber1: TSampleGrabber; btnTakePicture: TButton; Image1: TIma

是否可以通过DsPack组件从视频文件中获取位图

在这种情况下,我使用的是这个代码;但它无法拍摄屏幕截图:

type
  TForm4 = class(TForm)
    FilterGraph1: TFilterGraph;
    VideoWindow1: TVideoWindow;
    btnPlay: TButton;
    SampleGrabber1: TSampleGrabber;
    btnTakePicture: TButton;
    Image1: TImage;
    procedure btnPlayClick(Sender: TObject);
    procedure btnTakePictureClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

...

procedure TForm4.btnPlayClick(Sender: TObject);
begin
  SampleGrabber1.FilterGraph := FilterGraph1;
  VideoWindow1.FilterGraph := FilterGraph1;
  FilterGraph1.Active := true;
  FilterGraph1.RenderFile('C:\TEMP\1.mp4');
  FilterGraph1.Play;
end;

procedure TForm4.btnTakePictureClick(Sender: TObject);
begin
  SampleGrabber1.GetBitmap(Image1.Picture.Bitmap);
end;

是否可以修复此代码?

过了一会儿,我找到了解决此问题的示例:


我们可以使用“SnapShot.dpr”。这是一个随DsPack组件一起分发的示例。

DsPack演示显示了什么?您需要将这些过滤器连接到管道中吗?下载GraphEdit(DirectX SDK的一部分,但可以单独找到)并播放一点。您不仅应该添加这些过滤器,还应该连接它们。这里,SampleGrabber过滤器应该正确地定位在链中,比如
FileReader->MP4 Demuxer->Video Format Decompressor->Grabber->VideoWindows
。然而,在自动连接模式下,抓取器可能会被认为是不必要的负担而被忽略。您可以在
RenderFile
Play
之间检查管道是如何构建的吗?@Arioch,
RenderFile
使用构建过滤图。我只使用了DirectShow标题来完成这项工作,但似乎是将过滤器插入到过滤器图(您称之为管道)中,其余部分则由
RenderFile
处理(智能连接知道过滤器链中的过滤器位置)。但您可能是对的,样本抓取器被忽略了。