0

我有一个非常简单的程序,它使用 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
4

1 回答 1

3

没有内置支持无缝循环。是的,您当然可以接收完成事件,从头开始播放并再次运行图表,但这不可避免地会产生重启延迟并且可能会闪烁。

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

于 2013-01-06T11:22:37.387 回答