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

pcww981p  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(131)

我有一个非常简单的程序,使用DSPack从 Delphi 2010年。我有一个带有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
qlckcl4x

qlckcl4x1#

没有内置的无缝循环支持。是的,你当然可以接收完成事件,寻求回放到开始并再次运行图形,但是这将不可避免地有一个重新启动延迟和可能 Flink 。
要实现无缝循环,您可以使用multigraph解决方案,在演示图短暂暂停且不 Flink 时重新启动上游图。或者以其他方式将自定义过滤器添加到管道中,以在内部重新启动流式传输并将其呈现为连续流。

kqlmhetl

kqlmhetl2#

procedure <fORM>.FilterGraphComplete(Sender: TObject;
  Result: HRESULT; Renderer: IBaseFilter);
  var
  MediaSeeking: DirectShow9.IMediaSeeking;
var   Start,  Stop: Int64;

  FilterGraphR.QueryInterface(IMediaSeeking, MediaSeeking);
  Start := 0;
  Stop := 10 * 10000000;
  MediaSeeking.SetPositions(Start, AM_SEEKING_AbsolutePositioning, Stop, AM_SEEKING_NoPositioning);
end;

相关问题