Vytvořte si vlastní WinAmp - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Vytvořte si vlastní WinAmp

mp3_player

7. června 2001, 00.00 | Mp3 - jedněmi oslavovaný, jinými zatracovaný, revoluční zvukový formát si získává stále větší oblibu u uživatelů. Pokud chcete vědět, jak se přehrávají mp3 skladby v Delphi, přečtěte si tento článek.

Úvod


    Mp3 je bezesporu revolučním zvukovým formátem. MPEG Layer 3 dále jen Mp3 si získává stále více příznivců díky malé velikosti a velmi dobré kvalitě. Mp3 funguje na principu vynechávání zvuků, které lidské ucho nedokáže zachytit, a vysoké kompresi. Díky této metodě můžete mít z 50 MB písničky klidně 3 megový soubor. Někteří tvrdí: "Mp3 zabijí hudbu" jiní "Mp3 rozšiřuje hudbu". Tento audio formát si vysloužil podtitul "Bohatým bere chudým dává", protože na jedno 650 MB CD můžete nahrát 10-20 cédéček hudebních.
    Jedním z prvních mp3 přehrávačů byl WinAmp. Nyní je na takové úrovni, že málokterý přehrávač nabídne více možností a větší uživatelský komfort.

    Dnes Vám ukáži, jak vytvořit jednoduchý mp3 přehrávač. Možná někdo z Vás naprogramuje díky tomuto článku ještě lepší program, než je WinAmp.

    Přehrávání Mp3 v Delphi má více možností. "Empétrojky" můžete přehrávat pomocí nějaké speciální komponenty, nebo pomocí DirectX atd.   

MediaPlayer

    Dnes si ale ukážeme, jak vytvořit jednoduchý Mp3 Player pomocí komponenty MediaPlayer ze záložky System. Když zkusíte přiřadit soubor do vlastnosti FileName zjistíte, že máte na výběr z formátů .avi, .midi a .wav. Ale kde je .mp3? - Podle toho byste mohli usoudit, že komponenta MediaPlayer tyto soubory nepodporuje a šli byste na internet hledat komponentu, která formát .mp3 podporuje a umí ho přehrát. - Chyba! MediaPlayer "empétrojky" přehrávat dokáže. Jak? To Vám ukáže následující článek.


Design


    Jelikož budeme dělat jednoduchý přehrávač, budeme potřebovat jen tlačítka Play, Pause a Stop komponenty MediaPlayer. Nastavte tedy všechny podvlastnosti VisibleButtons kromě btPlay, btPause a btStop na false.

MediaPlayer_1.gif (1064 bytes)

    Vytvoříme si formulář, který nazveme MainForm a na něj přidáme tyto komponenty:

  • jeden ListBox, který nazveme mp3List
  • GroupBox s šesti komponentami Label a Edit
  • Timer, nazvaný ProgressTimer
  • Button , který pojmenujeme na mp3Loadbtn
  • MediaPlayer - mp3Player
  • ProgressBar s názvem Progress
  • StaticTex - txtFolder

 
Player.jpg (49162 bytes)

       Komponenty doporučuji sestavit podle obrázku. Do komponenty mp3List budeme přidávat .mp3 skladby tlačítkem mp3LoadBtn. Komponenta Progress nám bude ukazovat odehranou část každé skladby a GroupBox informace o skladbě.


Informace o skladbě


    V části interface si definujeme záznam pro čtení informací o skladbě z .mp3 souboru.

TID3Rec = packed record
  Tag : array[0..2] of Char;
  Title, // název
  Artist, // autor
  Comment,  // poznámka
  Album : array[0..29] of Char;  // název alba
  Year : array[0..3] of Char;  // rok vydání
  Genre : Byte;  // hudební žánr
end;

    Náš mp3 Player zatím nedokáže rozpoznat druh skladby. K tomuto účelu si nadefinujeme 147 hudebních stylů, které budeme zobrazovat v editačním poli edGendre. Nebudu je zde vypisovat, protože by to bylo zbytečné plýtvání prostorem k tomuto článku. Uvedu jen část pro pochopení.

const
  MaxID3Genre=147;
  ID3Genre: array[0..MaxID3Genre] of string = (
  'Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge',
 
  ...

  'Jpop', Synthpop'); // pravděpodobně by jich mohlo být i víc..


Nahrávání skladeb


    Pro načítání informací o skladbě budeme používat systemové IO rutiny. Následující kód Vám ukáže, jak zaplnit informace o skladbě do editačních políček v GroupBoxu.

procedure FillID3TagInformation(mp3File:string; Title,Artist,Album,Year,Genre,Comment:TEdit);
var ID3 : TID3Rec;
      fmp3: TFileStream;
begin
  fmp3:=TFileStream.Create(mp3File, fmOpenRead);
  try
    fmp3.position:=fmp3.size-128;
    fmp3.Read(ID3,SizeOf(ID3));
finally
    fmp3.free;
  end;

  if ID3.Tag <> 'TAG' then begin
    Title.Text:='Špatná nebo žádná informace';
    Artist.Text:='Špatná nebo žádná informace';
    Album.Text:='Špatná nebo žádná informace';
    Year.Text:='Špatná nebo žádná informace';
    Genre.Text:='Špatná nebo žádná informace';
    Comment.Text:='Špatná nebo žádná informace';
  end else begin
    Title.Text:=ID3.Title;
    Artist.Text:=ID3.Artist;
    Album.Text:=ID3.Album;
    Year.Text:=ID3.Year;
if ID3.Genre in [0..MaxID3Genre] then
    Genre.Text:=ID3Genre[ID3.Genre]
  else
    Genre.Text:=IntToStr(ID3.Genre);
    Comment.Text:=ID3.Comment
  end;
end;

    Kód je jednoduchý. Nejprve zjistíme jestli je informace v ID3 správná, nebo jestli vůbec existuje, a pak ji prostě doplníme do příslušných editačních políček.
    K načítání souborů budeme používat fci BrowseDialog a stejnojmenný dialog. Je lepší načítat soubory po složkách, tak jak to umí třeba WinAmp. Při nahrávání "empétrojek" po jednom byste se asi "uklikali". 

function BrowseDialog(const Title: string; const Flag: integer): string;
var
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  Result:='';
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  with BrowseInfo do begin
    hwndOwner := Application.Handle;
    pszDisplayName := @DisplayName;
    lpszTitle := PChar(Title);
    ulFlags := Flag;
  end;
  lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then begin
    SHGetPathFromIDList(lpItemID, TempPath);
    Result := IncludeTrailingBackslash(TempPath);
    GlobalFreePtr(lpItemID);
  end;
  end;

    Nejdřív se zobrazí BrowseDialog a Vy vyberete složku, ze které se mají skladby načíst. Soubory se pak zobrazí v mp3Listu bez cesty. Ta se objeví jako vlastnost Caption u komponenty txtFoder.
    O načítání všech souborů z dané složky se postará procedura
FillMP3FileList.

procedure FillMP3FileList(Folder: string; sl: TStrings);
var Rec : TSearchRec;
begin
  sl.Clear;
  if SysUtils.FindFirst(Folder + '*.mp3', faAnyFile, Rec) = 0 then
    try
      repeat
        sl.Add(Rec.Name);
      until SysUtils.FindNext(Rec) <> 0;
    finally
    SysUtils.FindClose(Rec);
  end;
end;

    Vlastní doplnění písniček do mp3Listu zajišťuje procedura mp3LoadbtnClick, která využívá již zmíněný BrowseDialog a proceduru FillMP3FileList.

procedure TMainForm.mp3LoadbtnClick(Sender: TObject);
var mp3Folder : string;
begin

  mp3Folder := BrowseDialog('Choose a folder with mp3 files', BIF_RETURNONLYFSDIRS);
  if mp3Folder = '' then Exit;

  txtFolder.Caption := mp3Folder;

 
  FillMP3FileList(mp3Folder, mp3List.Items);  // zaplní mp3List skladbami z dané složky
end;

    Informace o skladbě, které se zobrazují ve GroupBoxu, se budou načítat ze záznamu po vybrání jedné skladby tzn,. že obsluha události OnClick mp3Listu bude vypadat takto:

procedure TMainForm.mp3ListClick(Sender: TObject);
var mp3File:string;
begin
if mp3List.Items.Count=0 then exit;
  mp3File := Concat(txtFolder.Caption, mp3List.Items.Strings[mp3List.ItemIndex]);
  if not FileExists(mp3File) then begin
  ShowMessage('MP3 file '+#13#10+ mp3File +#13#10+'neexistuje!'); // kdyby se při běhu tento soubor smazal
  exit;
  end;

  FillID3TagInformation(mp3File, edTitle, edArtist, edAlbum, edYear, edGenre, edComment);

  Progress.Max:=0;

  mp3player.Close;
  mp3player.FileName:=mp3File;
  mp3player.Open;

  Progress.Max := mp3player.Length;
end;

    Hned při vytvoření formuláře si zjistíme, v jaké složce se nachází a vyhledáme v ní všechny .mp3 soubory a vlastnost Max u komponenty Progress nastavíme na 0. Následující kód ukazuje událost OnCreate formuláře MainForm..

procedure TMainForm.FormCreate(Sender: TObject);
begin
  txtFolder.Caption := ExtractFilePath(Application.ExeName);
  FillMP3FileList(txtFolder.Caption, mp3List.Items);
  Progress.Max:=0;
end;

Aktualizace informací


    Aby ProgressBar ukazoval odehraný čas každé skladby, musíme ho každou sekundu aktualizovat. K tomu nám bude sloužit ProgressTimer.

procedure TMainForm.ProgresTimerTimer(Sender: TObject);
begin
  if Progress.Max<>0 then
    Progress.Position := mp3player.Position;
end;

A takto vypadá náš WinAmp teď

Player1.jpg (77596 bytes)


Závěr


Přehrávání .mp3 souborů je o něco složitejší než přehrávání "prostých" wavů. Je také náročnější na systém. Proto nedoporučuji  pouštet Mp3 Player, uvedený v této ukázce, na něčem slabším než je Pentium 100. Zvukový formát Mp3 je velmi, možná i nejvíce, používaný pro hudbu na počítači a proto by se s mp3 rozhodně mělo v budoucnosti počítat.


Download


Ukázka + zdrojový kód (Delphi 5)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: