⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitmain.~pas

📁 delphi版的无缝播放器
💻 ~PAS
字号:
unit UnitMain;
// EOleError
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, Player, ExtCtrls, ComCtrls, DirectShow9,
  DSPack, MMSYstem, ActiveX;

type

  TForm1 = class(TForm)
    ListBox1: TListBox;
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    OpenDialog: TOpenDialog;
    CheckBox1: TCheckBox;
    TrackBar1: TTrackBar;
    Timer1: TTimer;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure ENDOFSEGMENT(var Message: TMessage);  message MSG_ENDOFSEGMENT;
    procedure DSEVENT(var Message: TMessage);  message MSG_DSEVENT;

  public
    { Public declarations }
  end;

{
		MESSAGE_HANDLER(MSG_ENDOFSEGMENT, OnEndOfSegment)
		MESSAGE_HANDLER(MSG_DSEVENT, OnDSEvent)

}

var
  Form1: TForm1;
  m_pPlayer: TClipPlayer;

    FGraphEditID  : Integer;  
implementation

{$R *.dfm}

 //----------------------------------------------------------------------------
  // Enable Graphedit to connect with your filter graph
  //----------------------------------------------------------------------------
  function AddGraphToRot(Graph: IFilterGraph; out ID: integer): HRESULT;
  var
    Moniker: IMoniker;
    ROT    : IRunningObjectTable;
    wsz    : WideString;
  begin
    result := GetRunningObjectTable(0, ROT);
    if (result <> S_OK) then exit;
    wsz := format('FilterGraph %p pid %x',[pointer(graph),GetCurrentProcessId()]);
    result  := CreateItemMoniker('!', PWideChar(wsz), Moniker);
    if (result <> S_OK) then exit;
    result  := ROT.Register(0, Graph, Moniker, ID);
    Moniker := nil;
  end;

  //----------------------------------------------------------------------------
  // Disable Graphedit to connect with your filter graph
  //----------------------------------------------------------------------------
  function RemoveGraphFromRot(ID: integer): HRESULT;
  var ROT: IRunningObjectTable;
  begin
    result := GetRunningObjectTable(0, ROT);
    if (result <> S_OK) then exit;
    result := ROT.Revoke(ID);
    ROT := nil;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  m_pPlayer:= TClipPlayer.Create(Handle,MSG_ENDOFSEGMENT,MSG_DSEVENT);


end;

procedure TForm1.Button3Click(Sender: TObject);
var
	pClip: TClipEntry;
  hr: HRESULT;
  t1: dword;
begin

  if(OpenDialog.Execute) then
  begin
  t1 := timeGetTime;
		hr := m_pPlayer.AddClip(OpenDialog.FileName, pClip);
   Label1.Caption := IntTOStr(timeGetTime - t1);
		if ((hr<>S_OK)) then
		begin
      Application.MessageBox('Cannot add clip: format not support', 'Incompatible Clip');
      exit;
		end;
    listBox1.Items.Add(OpenDialog.FileName);
  end;
//?		string sDesc = pClip->Name();

		// duration, limits dlg -- set clip limits (in seconds)
//?		LimitsDlg dlg(long((pClip->Duration() + UNITS - 1) / UNITS));
  AddGraphToRot(IFilterGraph2(m_pPlayer.FFilterGraph as IGraphBuilder), FGraphEditID);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  m_pPlayer.Play;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  m_pPlayer.Stop;
end;

procedure TForm1.ENDOFSEGMENT(var Message: TMessage);
begin
  m_pPlayer.OnEndOfSegment;
end;

procedure TForm1.DSEVENT(var Message: TMessage);
begin
  m_pPlayer.OnEvent;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  m_pPlayer.SetLoop(self.CheckBox1.Checked);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  tDuration, tNow: REFERENCE_TIME;
begin
{
  tDuration:= m_pPlayer.TotalDuration();
//	int iSliderPos = 0;
	if (tDuration > 0) then
	begin
		tNow := m_pPlayer.CurrentPosition();
		TrackBar1.Position := round(tNow * 1000 / tDuration);
    ListBox1.AddItem(IntTostr(tNow),nil);
	end;
  }


end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  RemoveGraphFromRot(FGraphEditID);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -