Pokud se obáváte, že multimediální programování v Delphi je něco obtížného, můžete na své obavy klidně zapomenout. Práce s multimédii, tedy přehrávání zvuků, hudebních souborů a CD, stejně jako přehrávání video souborů, je v Delphi opravdovou „dětskou slavností“.
Jak pracovat s multimédii v Delphi
Multimediální soubory mají mnoho různých formátů a pokud by bylo nutné detailně znát každý, který chceme přehrát, bylo by jistě téma multimédií určeno pouze úzkému okruhu profesionálů. Jak už to ale v takových případech bývá,
Delphi přichází s řešením, které programátorům maximálně zjednoduší situaci.
Díky komponentě MediaPlayer je možné přistupovat k většině funkcí Windows MCI (Multimedia Control Interface) naprosto unifikovaně a jednoduše. Stačí se seznámit s několika vlastnostmi a metodami této komponenty a můžete se směle pustit do vývoje multimediálních aplikací.
Přehrávač záznamů – MediaPlayer
Komponenta
MediaPlayer, která je typu TMediaPlayer, se nalézá v paletě
System. Pokud ji umístíte na formulář, uvidíte sadu tlačítek (Play, Stop, Eject, atd.), kterými lze ovládat multimediální zařízení jako např. CD-ROM mechaniku,
MIDI sekvencer nebo přehrávač videokazet připojený k PC. Multimediální zařízení může být jak hardwarové, tak softwarové.
Po vložení komponenty MediaPlayer na formulář uvidíte sadu tlačítek (viz následující obrázek). Myší je možné kliknout na každý z nich, nicméně nejsou to oddělené objekty (v Object Inspectoru nenaleznete různé komponenty typu Button, SpeedButton, apod.).
Jednotlivá tlačítka mají následující význam:
Tlačítko |
Hodnota* |
Význam |
Play |
btPlay |
Spustí přehrávání |
Pause |
btPause |
Pozastaví přehrávání (nebo záznam), a pokud je již pozastaveno, pokračuje v něm |
Stop |
btStop |
Zastaví přehrávání nebo záznam |
Next |
btNext |
Skočí na další stopu (nebo na konec, pokud přehrávané médium nemá stopy) |
Prev |
btPrev |
Skočí na předchozí stopu (nebo na začátek, pokud přehrávané médium nemá stopy) |
Step |
btStep |
Posune se dopředu o zadaný počet snímků – viz dále |
Back |
btBack |
Posune se dozadu o zadaný počet snímků |
Record |
btRecord |
Spustí záznam |
Eject |
btEject |
Vysune médium |
* - podle hodnoty tlačítka testujeme, které tlačítko bylo stisknuto, např. v ošetření události
OnClick komponenty
MediaPlayer.
Příklad:
procedure TfrmHlavni.MediaPlayerClick(Sender: TObject;
Button: TMPBtnType; var DoDefault: Boolean);
begin
if Button = btPlay
then ShowMessage(`Stisknuto tlačítko ``Play```);
end;
Ovládání základních činností MediaPlayeru (přehrávání, zastavení…) je možné buď kliknutím na příslušné tlačítko, nebo použitím analogických metod MediaPlayeru – viz dále.
Vlastnosti komponenty MediaPlayer
Přehrávač záznamů má velké množství vlastností (ať už svých nebo zděděných od svých předků), pomocí kterých je možné provádět velmi komplexní nastavování všemožných parametrů přehrávání. Vlastnosti zasluhující podrobnější popis jsou uvedeny v následujících odstavcích, další stručně shrnuje tabulka, která následuje.
AutoEnable
Říká, má-li MediaPlayer automaticky povolovat a zakazovat jednotlivá tlačítka. Komponenta „pozná“, která tlačítka jsou právě relevantní, podle nastavení vlastnosti Mode a podle aktuálního typu média. Pokud je AutoEnable zakázáno, řídí se povolování tlačítek nastavením vlastnosti EnableButtons.
AutoOpen
Určuje, má-li se při startu aplikace MediaPlayer automaticky zpřístupnit. Tato vlastnost neznamená automatický start přehrávání. Dojde pouze k (pokusu o) otevření média specifikovaného vlastností DeviceType a případně k zpřístupnění relevantních tlačítek.
AutoRewind
Specifikuje, má-li se médium „převinout“ na začátek před startem přehrávání či záznamu. Je-li zakázáno, musí uživatel stisknout tlačítko Prev (nebo musíme zavolat metodu Previous).
Capabilities
Read-only vlastnost, uchovává „schopnosti“ otevřeného média. Možné hodnoty:
- mpCanEject – lze vysunout;
- mpCanPlay – lze přehrát;
- mpCanRecord – lze zaznamenat;
- mpCanStep – lze se posouvat dopředu či dozadu;
- mpUsesWindow – používá okno k zobrazení výstupu.
Příklad:
if mpUsesWindow in MediaPlayer.Capabilities then
ShowMessage(`Výstup bude v okně.`);
Device Type
Specifikuje typ multimediálního zařízení otvíraného pomocí MediaPlayeru. Možná zařízení jsou uvedena v následující tabulce:
Hodnota (zařízení) |
Popis |
dtAutoSelect |
MediaPlayer sám vybere správné médium (zařízení) podle zvoleného (přehrávaného) souboru. |
dtAVIVideo |
Soubor *.AVI (Audio-Video Interleave). Obsahují video i zvuk. |
dtCDAudio |
Zvukový CD disk (přehrávaný v jednotce CD-ROM). |
dtDAT |
Digitální zvuková páska (DAT, Digital Audio Tape) přehrávaná na zařízení připojeném k PC. |
dtDigitalVideo |
Digitální video. |
dtMMMovie |
Multimedia Movie Format (multimediální film). |
dtOther |
Neurčený multimediální formát. |
dtOverlay |
Zařízení s překrývaným obrazem. |
dtScanner |
Scanner připojený k PC. |
dtSequencer |
MIDI sekvencer (soubory *.MID). |
dtVCR |
Přehrávač videokazet připojený k PC. |
dtVideodisc |
Přehrávač videodisků připojený k PC. |
dtWaveAudio |
Zvukový soubor *.WAV. |
Display
Určuje okno, ve kterém má proběhnout přehrávání (v případě, že přehrávání vyžaduje zvláštní okno, tedy např. u videa). Pokud není nastaveno žádné (nil), vytvoří se nové okno. Poznámka: není nutné nastavovat vždy jen okno, přehrávání může proběhnout i „v“ některých jiných komponentách, tedy uvnitř jejich klientské oblasti.
Mode
Read-only vlastnost, která indikuje stav aktuálně otevřeného multimediálního zařízení:
- mpNotReady – není připraveno;
- mpStopped – zastaveno;
- mpPlaying – právě probíhá přehrávání;
- mpRecording – právě probíhá záznam;
- mpSeeking – právě probíhá posouvání;
- mpPaused – pozastaveno;
- mpOpen – otevřeno;
Další vlastnosti
Další vlastnosti již velmi stručně shrne následující tabulka:
Vlastnost |
Popis |
DisplayRect |
Udává velikost okna (nastaveného ve vlastnosti Display), která bude použita k přehrávání. |
EnabledButtons |
Specifikuje tlačítka, která jsou povolena (Enabled). Povolená tlačítka jsou barevná a lze je stisknout. Je-li nastavena vlastnost AutoEnable = True, nemá nastavení EnabledButtons žádný vliv. |
EndPos |
Stanovuje pozici v souboru, na které skončí přehrávání / záznam |
FileName |
Udává jméno souboru určeného k přehrání (záznamu). |
Frames |
Udává počet snímků, o které se bude přehrávání posouvat při použití tlačítek Step a Back. |
Length |
Udává délku média (souboru) otevřeného v aktuálním zařízení. |
Notify |
Říká, bude-li generována událost OnNotify po skončení metody řízení média (např. po skončení přehrávání). Událost OnNotify viz dále. |
NotifyValue |
Indikuje výsledek poslední metody řízení média. |
Position |
Udává aktuální pozici v právě otevřeném souboru. |
TimeFormat |
Specifikuje formát , ve kterém budou udávány informace o pozici v souboru. |
StartPos |
Stanovuje pozici v souboru, na které začne přehrávání / záznam |
TrackLength |
Udává délku stopy. |
Tracks |
Specifikuje počet „přehratelných“ stop aktuálního média. |
VisibleButtons |
Říká, která tlačítka MediaPlayeru budou viditelná. |
Wait |
Pokud je True, je řízení předáno aplikaci až po skončení přehrávání (záznamu), v opačném případě se nebude čekat na dokončení aktuální operace MediaPlayeru. |
Metody komponenty MediaPlayer
Mnoho metod přehrávače záznamů přímo koresponduje s vlastnostmi této komponenty a s jejími tlačítky. Lze říci, že pro každé tlačítko (btPlay, btRecord, btStop, btNext, btPrev, btStep, btBack, btPause, btEject) existuje metoda, jejíž výsledek je stejný jako kliknutí na tlačítko.
Kromě těchto metod jsou zajímavé ještě mnohé následující – přehled viz následující tabulka:
Metoda |
Činnost |
DoNotify |
Generuje událost OnNotify – viz dále. |
PauseOnly |
Po jejím zavolání bude přehrávání (záznam) pozastaveno, a to i v případě, že před voláním PauseOnly již pozastaveno bylo. To je rozdíl od metody Pause, která pozastavené přehrávání opět spustí. |
Resume |
Pokračuje v pozastaveném přehrávání / záznamu. |
Rewind |
„Převine“ soubor na začátek. |
Jako
příklad práce s metodami vytvoříme následující aplikaci: přehrávač
AudioCD, který přehraje deset sekund z první skladby a následně vysune CD disk z mechaniky. Upozorňuji, že v následujícím příkladu nejsou prováděny žádné testy a ošetřeny žádné chyby (např. je-li zařízení připraveno, apod.).
Na formulář (Name = frmHlavni) umístěte dvě komponenty Button (btnStart a btnKonec), jeden MediaPlayer (MediaPlayer), jeden časovač (Timer1) a jeden nápis (komponenta Label, Name = lblZbyva).
Následující obrázek ukazuje možný vzhled vytvořené aplikace. Komponenta MediaPlayer je použita, ale není třeba ji uživateli ukazovat, proto je schována „za rohem“ (v neviditelné oblasti) formuláře:
unit Hlavni;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, MPlayer, ExtCtrls;
type
TfrmHlavni = class(TForm)
Timer1: TTimer;
MediaPlayer: TMediaPlayer;
btnStart: TButton;
btnKonec: TButton;
lblZbyva: TLabel;
procedure btnStartClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure btnKonecClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
Zbyva: Word;
{ Private declarations }
public
{ Public declarations }
end;
const
DELKA = 10;
var
frmHlavni: TfrmHlavni;
implementation
{$R *.DFM}
procedure TfrmHlavni.btnStartClick(Sender: TObject);
begin
MediaPlayer.DeviceType := dtCDAudio;
MediaPlayer.Open;
MediaPlayer.Play;
Timer1.Enabled := True;
Zbyva := DELKA;
lblZbyva.Caption := `Zbyva: ` + IntToStr(Zbyva);
end;
procedure TfrmHlavni.Timer1Timer(Sender: TObject);
begin
if Zbyva = 0 then
begin
MediaPlayer.Eject;
MediaPlayer.Close;
Timer1.Enabled := False;
end
else begin
Dec(Zbyva);
lblZbyva.Caption := `Zbyva: ` + IntToStr(Zbyva);
end;
end;
procedure TfrmHlavni.btnKonecClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfrmHlavni.FormActivate(Sender: TObject);
begin
Timer1.Enabled := False;
end;
end.
Události komponenty MediaPlayer
MediaPlayer nemá příliš mnoho událostí. Tři nejdůležitější si popíšeme:
OnClick
OnClick vzniká po kliknutí na některé tlačítko komponenty MediaPlayer. Metoda ošetřující událost OnClick má následující hlavičku:
procedure TfrmHlavni.MediaPlayerClick(
Sender: TObject;
Button: TMPBtnType;
var DoDefault: Boolean);
Je vidět, že máme k dispozici několik parametrů. Parametr Sender má obvyklý význam, z parametru Button se můžeme dozvědět, stisk kterého tlačítka na MediaPlayeru vyvolal událost OnClick. Možné hodnoty jsou uvedeny v jedné z tabulek výše, za ní následuje také příklad na testování tohoto parametru.
Parametr DoDefault říká, má-li se automaticky zavolat metoda odpovídající stisknutému tlačítku. Například pokud uživatel stiskl tlačítko Play (btPlay), bude zavolána metoda Play. Pokud se DoDefault zakáže, je nutné ručně provést všechny akce, které mají následovat po stisknutí každého tlačítka.
Příklad:
procedure TfrmHlavni.MediaPlayerClick(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
begin
DoDefault := false;
< Stisk tlačítka nevyvolá žádnou akci, >
< vše musíme naprogramovat sami >
end;
OnNotify
Událost je generována při skončení provádění některé metody pro řízení přehrávače záznamů. Aby došlo ke generování této události, musí být navíc nastavena hodnota vlastnosti Notify na True.
Například pokud uživatel klikne na tlačítko Play, proběhne přehrání aktuálního souboru a jakmile přehrávání skončí, dojde k vyvolání události OnNotify (za předpokladu, že vlastnost Notify = True).
OnPostClick
Tato událost je podobná události OnClick, ale má jednu významnou odlišnost. Zatímco OnClick vzniká ihned při kliknutí na tlačítko, událost OPostClick je generována až po akci způsobené kliknutím.
Například když uživatel klikne na tlačítko Play v komponentě MediaPlayer, je generována událost OnClick a začne přehrávání. Událost OnPostClick je však generována až po skončení přehrávání.
Aby komplikací nebylo málo, prohlásím nyní, že předchozí odstavec není tak úplně pravdivý. Neděste je, vysvětlení je ve skutečnosti jednoduché, jen vše působí trochu zmateně.
Je-li nastavena vlastnost Wait komponenty MediaPlayer na hodnotu True, vznikne OnPostClick skutečně až po skončení celé akce (tedy např. po přehrání celého souboru). Pokud je ale nastaveno Wait = False, nečeká řízení aplikace na skončení přehrávání, takže událost OnPostClick vzniká bezprostředně po události OnClick, a to i při běžícím přehrávání.
Velmi jednoduchý přehrávač
Na základě příkladu uvedeného v předchozí podkapitole si asi již dovedete představit, jak naprogramovat jednoduchý přehrávač CD. Nyní si předvedeme, jak vytvořit velmi jednoduchý přehrávač hudebních a video souborů.
Následující aplikace umí přehrávat běžné multimediální soubory. Vzhledem k přítomnosti dialogu pro otevření souboru bude možné otvírat soubory z libovolného umístění. Aplikace je velmi jednoduchá a demonstruje čistě jen práci s komponentou MediaPlayer.
Na formulář (Name = frmHlavni) umístěte dvě komponenty Button (btnOtevri a btnKonec), jeden MediaPlayer (MediaPlayer) a jeden dialog pro otevření souboru (OpenDialog, Name = dlgOpen).
Následuje zdrojový kód modulu příkladu. Důležité vlastnosti jsou pro názornost nastaveny v ošetření události OnActivate hlavního formuláře. Podotýkám, že nejsou ošetřovány žádné chybové stavy (ale díky implicitnímu handleru výjimek v Delphi samozřejmě všechny případné chyby nakonec ošetřeny budou).
unit Hlavni;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, MPlayer;
type
TfrmHlavni = class(TForm)
MediaPlayer: TMediaPlayer;
dlgOpen: TOpenDialog;
btnOtevri: TButton;
btnKonec: TButton;
procedure btnOtevriClick(Sender: TObject);
procedure btnKonecClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmHlavni: TfrmHlavni;
implementation
{$R *.DFM}
procedure TfrmHlavni.btnOtevriClick(Sender: TObject);
begin
if dlgOpen.Execute then begin
MediaPlayer.DeviceType := dtAutoSelect;
MediaPlayer.FileName := dlgOpen.Filename;
MediaPlayer.Open;
end;
end;
procedure TfrmHlavni.btnKonecClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfrmHlavni.FormActivate(Sender: TObject);
begin
MediaPlayer.AutoEnable := True;
MediaPlayer.AutoOpen := False;
MediaPlayer.DeviceType := dtAutoSelect;
end;
end.
Možný vzhled aplikace ukazuje následující obrázek. Mezi vylepšení, která by stála za implementaci, by určitě patřilo omezení typů souborů, které zobrazuje OpenDialog (nastavuje se pomocí vlastnosti Filter).