ZeePlayer
Ver. 1.2
ZeePlayer, versiunea 1.2 se vrea a fi si poate deveni cel mai mic si mai simplu video player existent. Cu o ,,greutate'' de numai 1,14MB, ZeePlayer poate concura cu succes player-ele existente pe piata, datorita interfetei sale usor de folosit, precum si datorita simplitatii sale.
Geneza
Versiunea ZeePlayer-ului de fata a fost construita si dezvoltata cu ajutorul limbajului de programare Delphi 6.
În scrierea unui program de redare video AVI, asa cum este aplicatia ZeePlayer, sunt implicati o multime de factori. Rezultatul final este afectat de versiunea sistemului de operare, dispozitivele hardware de afisare, driverele video si formatul fisierelor AVI. În orice caz, componenta MediaPlayer pare a fi foarte robusta - am folosit programul Ze 20320o142u ePlayer pentru redarea unor clipuri AVI deteriorate, care nu puteau fi redate prin nici un alt mijloc.
Pe ecran componenta MediaPlayer este reprezentata doar de o bara cu butoane pe care utilizatorii pot executa clic pentru operarea obiectului, ca si când ar folosi butoanele unui VCR.
Figura de mai sus prezinta un obiect MediaPlayer nemodificat, inserat într-un formular. Cele noua butoane, de la stânga la dreapta, sunt: Play, Pause, Stop, Next, Previous, Step, Back, Record si Eject. Trei proprietati afecteaza aspectul butoanelor. Am folosit proprietatea ColoredButtons ca sa afisam butoanele colorate, cealalta varianta permitându-ne sa le afisam monocromatic, alb-negru. Am folosit proprietatea EnabledButtons ca sa activam sau sa dezactivam butoanele individuale (butoanele dezactivate sunt afisate estompat si nu pot fi selectate). Am folosit proprietatea VisibleButtons ca sa indicam butoanele care trebuie afisate. Aceasta proprietate este utila pentru ascunderea butoanelor nedorite - aplicatia ZeePlayer nu afiseaza butonul Record, deoarece acesta nu are nici o utilitate în program.
Pentru redarea unui clip AVI am folosit o caseta de dialog - OpenDialog1. ZeePlayer demonstreaza programarea acestei actiuni în procedura de tratare a evenimentelor ButtonClick, care este apelata atunci când executati clic pe butonul Deschide fisier audio:
Dupa aceste doua etape, metoda Open încarca fisierul în memorie, dar înca nu începe redarea. Pentru a indica numarul de cadre cu care avanseaza butonul pas cu pas (Step), proprietatii Frames îi este atribuita valoarea 1 ( în mod normal, Frames are ca valoare o zecime din numarul de cadre al secventei video, dar este de preferat avansul cadru cu cadru).
Pentru a începe redarea clipului AVI, procedura de tratare a evenimentelor apeleaza metoda Play pentru obiectul MediaPlayer1. Este suficient sa o apelati pentru a rula clipul video. Daca programul nu apeleaza metoda Play, utilizatorul trebuie sa execute clic pe butonul Play ca sa înceapa redarea clipului AVI.
Unul dintre aspectele mai complicate ale folosirii componentei MediaPlayer este raspunsul la notificarile media. Atribuind proprietatii Notify valoarea True, am semnalat ca dorim sa primim aceste notificari, care sunt generate pentru diferite evenimente, cum ar fi pornirea si oprirea unui clip video. Pentru a raspunde la aceste notificari, am atribuit valoarea True proprietatii Notify ( acest lucru s-a facut printr-o instructiune din program, ca în fragmentul de cod de mai sus ) si am creat o procedura de tratare a evenimentului OnNotify pentru obiectul MediaPlayer. Iata cum arata procedura de tratare a evenimentului OnNotify în aplicatia ZeePlayer:
Rolul acestui cod este sa reia de la început redarea clipului AVI curent daca utilizatorul a validat caseta Auto replay. Deoarece aceeasi procedura primeste numeroase modificari, primul pas este sa verifice daca clipul a fost oprit, caz în care redarea porneste de la început. Daca nu este validata caseta Auto replay, procedura nu face nimic si secventa video se opreste la sfârsit ( sau acolo unde se afla atunci când utilizatorul a executat clic pe butonul Stop ).
O problema a notificarilor este faptul ca redarea clipului este reluata de la început, în loc sa se opreasca imediat, atunci când utilizatorul executa clic pe butonul Stop. În forma de mai sus, OnNotify repeta clipul curent daca este selectata caseta de validare Auto replay - acest fapt determinând repetarea clipului chiar dupa ce acesta a fost oprit de utilizator. Pentru rezolvarea acestei probleme, o procedura de tratare a evenimentului OnClick pentru obiectul MediaPlayer verifica daca utilizatorul a apasat butonul Stop. Iata procedura completa din aplicatia ZeePlayer.
Un alt parametru primit de procedura de tratare a evenimentului OnClick al obiectului MediaPalyer, DoDefault, indica daca programul sau componenta vor executa actiuni standard. Daca DoDefault este True (valoarea prestabilita), componenta executa codul standard pentru toate butoanele. De exemplu, daca s-a executat clic pe butonul Play, MediaPlayer apeleaza propria metoda Play.
Pentru a nu fi executate metode proprii ale componentei, am atribuit valoarea false indicatorului DoDefault în procedura de tratare a evenimentului OnClick al obiectului MediaPlayer. În acest fel, componenta stie ca am executat alte actiuni pentru un anumit buton. De exemplu, pentru redarea cadru cu cadru a unui clip AVI am folosit urmatoarea secventa de cod în procedura de tratare a evenimentului:
If button=btStep then
begin
MediaPlayer1.Frames:=1;
MediaPlayer1.Step;
DoDefault:=false;
end;
Dupa cum se poate observa si de pe pictograma aplicatiei ZeePlayer, aceasta contine, pe lânga componenta MediaPlayer si doua butoane de tip TButton, care se gasesc în paleta de instrumente Standard.
Butonul Deschide fisier audio este un buton caruia i-a fost explicata utilitatea, functionarea lui fiind strâns legata de cea a obiectului OpenDialog;
Proprietatile componentei Media Player
În continuare, sunt prezentate pe scurt câteva proprietati ale componentei Media Player pe care puteti sa le folositi pentru personalizarea obiectelor de acest tip:
AutoEnable - Atribuiti valoarea True acestei proprietati ca sa activati si sa dezactivati butoanele obiectului Media Player în functie de starea dispozitivelor multimedia. De exemplu, atunci când aceasta proprietate are valoarea True, butonul Play este dezactivat daca nu este încarcat nici un fisier. Selectati valoarea False daca doriti ca toate butoanele sa fie activate permanent (acest lucru poate parea fara sens, dar mai gânditi-va un moment).
Aplicatia Video Player foloseste aceasta optiune.
AutoOpen - Atribuiti valoarea True acestei proprietati ca sa deschideti automat fisierul specificat prin proprietatea FileName. Daca Auto Open are valoarea False, trebuie sa apelati metoda Open pentru deschiderea fisierului.
AutoRewind - Atribuiti valoarea True acestei proprietati ca sa treceti la începutul fisierului multimedia dupa terminarea redarii. Apasarea butonului Play repeta redarea de la început.
DeviceType - Folositi aceasta proprietate ca sa specificati tipul dispozitivului sau al fisierului controlat de obiectul MediaPlayer. Valoarea prestabilita, dtAutoSelect, determina tipul dispozitivului si, ca urmare, tipul driverului de dispozitiv folosit, în functie de extensia fisierului, asa cum a fost aceasta înregistrata în Windows. Pentru specificarea unui tip particular de dispozitiv ,puteti sa atribuiti proprietatii DeviceType una dintre valorile : dtAVIVideo, dtCAudio,dtDat, dtDigitalVideo, dtMMovie, dtOther, dtOverlay, dtScaner, dtSequencer, dtVCR, dtVideodisc sau dtWaveAudio.
Display - Atribuiti acestei proprietati numele unei componente de tip fereastra, cum ar fi Panel sau Form. Iesirile obiectului MediaPlayer sunt trimise catre componenta specificata. Totusi, unele tipuri de fisiere media sunt redate întotdeauna într-o fereastra separata . Ca rezultat, proprietatea Display este ignorata pentru mediile Animation, AVI Video (cu sunet), Digital Video, Overlay si VCR.
FileName - Atribuiti acestei proprietati numele fisierului care trebuie deschis. Daca AutoOpen are valoarea True, modificarea proprietatii FileName determina apelarea automata a metodei Open.
Frames - Aceasta proprietate specifica numarul de cadre cu care se avanseaza atunci când utilizatorul executa clic pe butoanele Step sau Back. În mod normal, Frames are o valoare egala cu o zecime din numarul total de cadre continute de fisier. Schimbati aceasta valoare dupa ce apelati metoda Open ca sa modificati numarul de cadre cu care se avanseaza în timpul operatiilor pas cu pas.
Mode - De obicei, examinati aceasta proprietate în procedura de tratare a evenimentului OnNotify al obiectului MediaPlayer (asigurati-va ca ati atribuit proprietatii Notify valoarea True, astfel încât procedura sa primeasca notificari).
Proprietatea Mode poate avea una dintre valorile mpNotReady, mpPlaying, mpRecording, mpSeeking, mpPaused sau mpOpen.
Codul sursa. În continuare am considerat necesara dezvaluirea codului sursa a ZeePlayer-ului, pentru o întelegere mai buna a modului de functionare:
unit Main1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, MPlayer,comctrls, ExtCtrls,jpeg,about, Gauges;
type
TForm1 = class(TForm)
MediaPlayer1: TMediaPlayer;
OpenDialog1: TOpenDialog;
AutoPlayCheckBox: TCheckBox;
TimeLabel: TLabel;
Timer1: TTimer;
Button1: TButton;
Image1: TImage;
ListBox1: TListBox;
Image2: TImage;
Image3: TImage;
Gauge1: TGauge;
Button2: TButton;
procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
procedure AutoPlayCheckBoxClick(Sender: TObject);
procedure MediaPlayer1Notify(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image3MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ListBox1DblClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
procedure Delay(msecs:integer); //face o pauza
var
FirstTickCount:longint; //nr de msec de cand a pornit numararea
begin
FirstTickCount:=GetTickCount;//GetTickCount returneaza numarul de msec de cand a pornit Win
repeat
Application.ProcessMessages;//obliga aplicatia sa nu ramana blocata
until ((GetTickCount-FirstTickCount) >= Longint(msecs));
end
procedure TForm1.Button2Click(Sender: TObject);
begin
gauge1.Visible:=True; //face vizibila componenta gauge1
if MediaPlayer1.Mode=mpPlaying then begin MediaPlayer1.Stop;MediaPlayer1.Close;end;
with mediaplayer1 do
begin
enabled:=True;
devicetype:=dtAutoSelect;
end
if opendialog1.execute then
begin
form1.Caption:=opendialog1.filename;
mediaplayer1.filename:=opendialog1.filename;
listBox1.Items.add(opendialog1.filename);
listBox1.Items.SaveToFile('c:\playlist.txt');
delay
mediaplayer1.notify:=true;
mediaplayer1.open;
gauge1.MaxValue:=mediaplayer1.Length;
//mediaplayer1.frames:=1;
mediaplayer1.play;
end
end
procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
begin
if (button=btstop)or(button=btpause)
then mediaplayer1.Notify:=false
else mediaplayer1.Notify:=true;
If button=btStep then
begin
MediaPlayer1.Frames:=1;
MediaPlayer1.Step;
DoDefault:=false;
end;
end
procedure TForm1.AutoPlayCheckBoxClick(Sender: TObject);
begin
if autoplaycheckbox.checked then
mediaplayer1.Notify:=true;
end
procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
if (mediaplayer1.notify)
and(mediaplayer1.mode=mpStopped)and
(autoplaycheckbox.checked) then
begin
mediaplayer1.Rewind;
mediaplayer1.Play;
end;
mediaplayer1.notify:=true;
end
procedure TForm1.Timer1Timer(Sender: TObject);
begin
TimeLabel.Caption:=TimeToStr(Time);
gauge1.Progress:=mediaPlayer1.Position;
end
procedure TForm1.Button1Click(Sender: TObject);
begin
gauge1.visible:=False;
with mediaplayer1 do
begin
enabled:=True;
devicetype:=dtcdaudio;
filename:=' ;
open;
end
form1.Caption:='CD player';
end
procedure TForm1.FormCreate(Sender: TObject);
begin
delay
if not(FileExists('c:\playlist.txt')) then
listBox1.Items.SaveToFile('c:\playlist.txt');
listBox1.Items.LoadFromFile('c:\playlist.txt');
end
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if MediaPlayer1.Mode=mpPlaying then MediaPlayer1.Stop;
MediaPlayer1.Close;
end
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if opendialog1.execute then
begin
form1.Caption:=opendialog1.filename;
listBox1.Items.add(opendialog1.filename);
listBox1.Items.SaveToFile('c:\playlist.txt');
end;
end
procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ListBox1.ItemIndex<>-1 then
begin
if MediaPlayer1.FileName=ListBox1.Items.Strings[ListBox1.Itemindex] then
begin
if MediaPlayer1.Mode=mpPlaying then
begin
MediaPlayer1.Stop;
MediaPlayer1.Close;
end
end
ListBox1.Items.Delete(ListBox1.ItemIndex);
end
end
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
gauge1.visible:=True;
if ListBox1.Itemindex=-1 then exit;
if MediaPlayer1.Mode=mpPlaying then begin MediaPlayer1.Stop;MediaPlayer1.Close;end;
with mediaplayer1 do
begin
enabled:=True;
devicetype:=dtAutoSelect;
end
form1.Caption:=ListBox1.Items.Strings[ListBox1.Itemindex];
mediaplayer1.filename:=ListBox1.Items.Strings[ListBox1.Itemindex];
mediaplayer1.notify:=true;
mediaplayer1.open;
//mediaplayer1.frames:=1;
mediaplayer1.play;
gauge1.MaxValue:=mediaplayer1.Length;
end
end
|