你如何使用DSPack循环视频?

时间:2013-01-05 21:51:43

标签: delphi video directshow dspack

我有一个非常简单的程序,它使用Delphi 2010中的DSPack。我有一个带有TFilterGraph和TVideoWindow的表单。视频播放和呈现很好。我似乎无法弄清楚如何在视频循环结束时将视频循环回到开头。

如何使用DSPack自动循环播放视频?

代码

unit Unit21;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DSPack, ExtCtrls;

type
  TForm21 = class(TForm)
    FilterGraph1: TFilterGraph;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    VideoWindow1: TVideoWindow;
    Panel2: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form21: TForm21;

implementation

{$R *.dfm}

procedure TForm21.Button1Click(Sender: TObject);
begin
  OpenDialog1.InitialDir := ExtractFilePath(ParamStr(0));
  if OpenDialog1.Execute then
  begin
    if not FilterGraph1.Active then FilterGraph1.Active:= True;
    VideoWindow1.FilterGraph:= FilterGraph1;
    FilterGraph1.RenderFile(OpenDialog1.Filename);
    FilterGraph1.Play;
  end;
end;

procedure TForm21.Button2Click(Sender: TObject);
begin
  FilterGraph1.Stop;
end;

procedure TForm21.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  FilterGraph1.ClearGraph;
  FilterGraph1.Active:= False;
end;

end.

DFM


object Form21: TForm21
  Left = 0
  Top = 0
  Caption = 'Form21'
  ClientHeight = 441
  ClientWidth = 644
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCloseQuery = FormCloseQuery
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 644
    Height = 384
    Align = alClient
    Caption = 'Panel1'
    TabOrder = 0
    object VideoWindow1: TVideoWindow
      Left = 1
      Top = 1
      Width = 642
      Height = 382
      Mode = vmVMR
      FilterGraph = FilterGraph1
      VMROptions.Mode = vmrWindowed
      Color = clWhite
      Align = alClient
    end
  end
  object Panel2: TPanel
    Left = 0
    Top = 384
    Width = 644
    Height = 57
    Align = alBottom
    Caption = 'Panel2'
    TabOrder = 1
    object Button1: TButton
      Left = 24
      Top = 16
      Width = 75
      Height = 25
      Caption = 'Play'
      TabOrder = 0
      OnClick = Button1Click
    end
    object Button2: TButton
      Left = 128
      Top = 16
      Width = 75
      Height = 25
      Caption = 'Stop'
      TabOrder = 1
      OnClick = Button2Click
    end
  end
  object FilterGraph1: TFilterGraph
    GraphEdit = True
    LinearVolume = True
    Left = 424
    Top = 144
  end
  object OpenDialog1: TOpenDialog
    Left = 344
    Top = 128
  end
end

1 个答案:

答案 0 :(得分:2)

没有内置支持无缝循环。是的,您当然可以接收完成事件,在开始时寻找回放并再次运行图形,但是这将不可避免地具有重启延迟并且可能闪烁。

要实现无缝循环,您可以使用多图解决方案,重新启动上游图形,同时显示图形处于短暂停顿状态并且不会闪烁。或者以其他方式将自定义过滤器添加到管道中以在内部重新启动流并将其作为连续流呈现。