📄 unitmain.~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 + -