Umíme to s Delphi, 19. díl – multimédia v Delphi

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).

Diskuze (5) Další článek: V Evropě iPaq dotahuje na Palm

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,