Václav Kadlec 19.4.2005
Dnes si ukážeme co dělat v případě, že chcete naprogramovat aplikaci zpracovávající MP3 soubory a jejich rozšíření - ID3 tagy ve verzi 2. Ukážeme si knihovnu, díky níž je zpracování komplikovaných tagů velmi jednoduché a přímočaré i pro úplné začátečníky.
Dnešní díl seriálu se po dlouhé době přestává zabývat pustou teorií a zaměří se na ryzí praxi. Nejprve si shrneme, co jsme se naučili v předchozích částech a posléze si povíme, co nás čeká dnes.
Nejprve tedy stručné shrnutí. Už delší dobu se v našem seriálu zabýváme zpracováním souborů MP3, což je velmi populární formát pro uchování komprimované digitální hudby. Několik posledních pokračování seriálu se pak týkalo technologie ID3, resp. její novější odnože ID3v2, které umožňují obohatit zmíněné hudební soubory (v našem případě soubory MP3) o textové nebo jiné informace, díky nimž se součástí skladby může stát i jméno autora, text písně, rok vydání apod.
V pěti předešlých článcích jsme se detailně zabývali právě strukturou a formátem ID3v2 tagu. Vycházeli jsme ze specifikace tohoto formátu, která je volně dostupná na adrese http://www.id3.org/id3v2.4.0-structure.txt.
Shrnutí obsahu předešlých částech najdete v následujícím přehledu:
Poslední věcí, kterou si v rámci dnešního shrnutí předchozích dílů zopakujeme, je schéma tagu ID3v2. Tag vypadá takhle:
+--------------------------------------+
|
Hlavička (Header) - 10 bajtů
|
+--------------------------------------+
| Rozšířená hlavička (Extended
Header) |
| (proměnná délka,
NEPOVINNÁ)
|
+--------------------------------------+
|
Rámce (Frames) |
|
(proměnná délka)
|
+--------------------------------------+
|
Padding
|
| (proměnná délka,
NEPOVINNÁ)
|
+--------------------------------------+
|
Patička (Footer)
|
| (10 bajtů,
NEPOVINNÁ)
|
+--------------------------------------+
Jak bylo patrné z předchozích částí seriálu, technologie ID3v2 je poměrně komplikovaná a na rozdíl od jednoduchých tagů první verze (ID3v1) je její použití trochu obtížnější. Může za to celá řada faktorů souvisejících se sofistikovaností a většími možnostmi druhé verze tagování.
Tak především, nikdy není úplně jasné, kde je vlastně tag v souboru umístěn. Kromě toho, nikdy nevíme, co vlastně přesně obsahuje. Řekli jsme si, že každý tag začíná hlavičkou (ať už běžnou nebo navíc rozšířenou), končí patičkou nebo případnými výplněmi (paddingem). Dále jsme si prozradili, že hlavní náplň a obsah tagu se nachází v tzv. rámcích (frames).
Zde ale nastává ten pravý kámen úrazu. Sice víme, že veškerý obsah se nalézá v rámcích, ale ani v nejmenším nevíme, kolik rámců v tagu je, jak vypadají, co obsahují a v jakém formátu jsou uvedeny (to pak poznáme typicky podle nejrůznější flagů, viz obsah předchozích částí seriálu).
Z toho všeho plyne, že použití technologie ID3v2 v našich aplikacích není samozřejmě vyloučené, ale vyžaduje podstatně víc pozornosti, času a trpělivosti než integrování a implementování předchozí (první) verze tagů.
Protože náš seriál je primárně zaměřen na začátečníky a mírně pokročilé, a protože se točíme okolo technologie MP3 už pěkně dlouho, nerad bych strávil dalších osm dílů tím, že bychom se společně pokoušeli implementovat kompletní podporu druhé verze tagů do našich vlastních aplikací. Bylo by to zdlouhavé.
Kromě toho, nebylo by to vůbec účelné. Důvod je prostý: na internetu je k dispozici několik knihoven, které udělají drtivou většinu "špinavé práce" za nás. Stačí je najít, nainstalovat (někdy ani to ne), prozkoumat a následně jednoduše použít. Výsledky jsou přitom skvělé a dobereme se k nim podstatně rychleji a elegantněji.
Právě k tomuto řešení se přikloníme v dnešním a následujícím dílu našeho seriálu. Ukážeme si jedno z možných řešení, tedy jednu z existujících knihoven, díky nimž je použití technologie ID3v2, která je jinak poměrně komplikovaná, jednoduché a přímočaré.
Začneme tím, že se podíváme, jaké všechny implementace technologie ID3v2 jsou v současnosti k dispozici. Podíváte-li se na web zabývající se ID3v2 technologií, tedy na web http://www.zive.cz/Administration/ElBarto/www.id3.org, rychle si všimnete sekce "Implementation". Právě tato sekce nás zajímá; klikněte na odkaz a uvidíte seznam současných známých (a vyzkoušených) implementací.
Je vidět, že v současnosti existují implementace technologie ID3v2 pro následující jazyky a vývojová prostředí:
Pro nás je samozřejmě nejzajímavější poslední zmíněná sekce, tedy sekce týkající se Borland Delphi. Jak se dozvídáme ze stránek, James Webb vytvořil knihovnu pro Delphi, pomocí které lze číst upravovat a zapisovat ID3 tagy ze a do souborů.
Klepneme na příslušný odkaz (ID3v2 Delphi Library) a dostaneme se na stránku http://www.audioxl.com/id3v2lib.html, což je přímo domovská stránka projektu.
Takže: potřebujeme-li do našeho projektu přidat podporu ID3v2, aniž se nám chce spisovat příliš programového kódu, je tato knihovna dobrým řešením. Knihovna se (podle slov svého tvůrce) snaží zjednodušit práci s ID3v2 tagy na maximální možnou úroveň, s tím, že se zároveň pokouší ponechat k dispozici přirozenou flexibilitu formátu ID3v2.
Poslední verze knihovny, verze 1.0.5 (s tím, že se jedná skutečně o poslední verzi, žádná další už uvolněna nebude, autor pracuje na jiných projektech), podporuje následující vlastnosti (kromě jiných; nejedná se o kompletní výčet):
Stažení a instalace knihovny jsou mimořádně snadné. Stačí najít stránku pro download (http://www.audioxl.com/idl-download.html), zvolit požadovanou verzi Delphi (k dispozici jsou knihovny pro Delphi 4, Delphi 5, Delphi 6 a Delphi 7) a kliknout na příslušný název knihovny.
Velikost komprimované knihovny je něco okolo 60 kB, takže ke stažení dojde prakticky okamžitě.
Po stažení stačí archiv (ve formátu ZIP) rozbalit a jste prakticky hotovi. Hlavní složkou celé knihovny je zkomprimovaná Delphi unita (id3v2.dcu), kterou stačí přidat do projektu a můžete automaticky začít přistupovat ke všem funkcím, které jsou v knihovně k dispozici.
Jediné, co tedy musíte (z implementačního hlediska) udělat, je vzít soubor id3v2.dcu, zkopírovat jej do některého ze systémových adresářů Delphi a nebo do adresáře s projektem, a přidat modul id3v2 do sekce Uses:
uses
Windows, Messages, ..., id3v2;
Od tohoto okamžiku můžete používat vše, co knihovna nabízí (viz dále).
Závěrem dodejme, že zajímáte-li se o zdrojové kódy knihovny, máte šanci: zdrojáky sice nejsou volně dostupné, můžete si je však jednoduše objednat (například zde) a po zaplacení 149 amerických dolarů jsou zdrojové kódy vaše.
Pojďme se podívat na to, jaké funkce a jaká rozhraní nám knihovna dává k dispozici (jinak řečeno, co vlastně můžeme z knihovny používat). Nebudeme vyjmenovávat úplně všechny, zaměříme se jen na nejdůležitější a nejčastěji používané zástupce.
Hned na úvod uveďme nejdůležitější informaci: knihovna definuje třídu Tid3v2tag, která reprezentuje celý tag v rámci aplikací. Abychom mohli s knihovnou pracovat, musíme tedy definovat objekt této třídy, nad nímž pak budeme volat veškeré metody pro zpracování tagu. Příklad: nejprve definujeme objekt myTag:
myTag: Tid3v2Tag;
následně nad proměnnou myTag voláme požadované metody, např.
tempInt := myTag.loadFromFile(OpenDialog1.filename, 0);
Toto byla vlastně nejdůležitější informace o celé knihovně. Uvedeme si ještě několik dalších, také užitečných. Začneme druhy rámců. Knihovna rozeznává několik speciálních druhů rámců:
COMM = record
encoding:
byte;
language: string[3];
description: string;
body: string; //hlavní řetězec
reprezentující rámec
end;
USLT = record
encoding:
byte;
language: string[3];
description: string;
body: string; //hlavní řetězec
reprezentující rámec
end;
USER = record
encoding:
byte;
language: string[3];
body:
string; //hlavní řetězec reprezentující rámec
end;
TXXX = record
encoding:
byte;
description: string;
body:
string; //hlavní řetězec reprezentující rámec
end;
WXXX = record
encoding:
byte;
description: string;
body:
string; //hlavní řetězec reprezentující rámec
end;
Pokračovat budeme funkcemi a datovými strukturami týkajícími se celého tagu (Tag level).
Následující struktura obsahuje options, tedy možnosti ovlivňující zpracování (především načítání a ukládání) celého tagu. Uvedeme jen strukturu jako takovou, bez podrobnějších popisů:
Tid3v2tag.Options : record
highMinor : boolean;
bypassUnsupported : boolean;
adhereToStandard : boolean;
compLevel : byte;
smartPadding : byte;
clusterSize : cardinal;
maxPaddingSize :
cardinal;
end;
Následující funkce jsou nejdůležitější pro operaci s tagem jako takovým, umožňují totiž načíst a uložit tag ze/do souboru/streamu:
function loadFromFile(tagFileName:string;
tagLoc:Int64):WORD;
{Načte ID3v2 tag ze souboru do paměti.}
// tagFileName je jméno souboru, v němž je ID3v2
tag
// tagLoc je umístění tagu uvnitř souboru
function loadFromStream(var tagStream:
TMemoryStream; tagLoc:Int64):WORD;
{Načte ID3v2 tag z paměťového streamu do specifikované struktury reprezentující tag.}
// tagStream je jméno paměťového streamu
obsahujícího tag
// tagLoc je umístění tagu uvnitř streamu
function saveToFile(tagFileName : string;
majorVer : byte;
minorVer : byte; const tagLoc : Int64) :
WORD;
{Uloží ID3v2 tag do souboru.}
// tagFileName je jméno souboru, do něhož chceme
ukládat
// majorVer/minorVer jsou čísla verzí (liší-li se od původních,
volitelné)
// tagLoc je umístění tagu v souboru (liší-li se od
původního)
function saveToStream(var tagStream:
TMemoryStream; majorVer : byte; minorVer : byte; const tagLoc : Int64) :
WORD;
{Uloží tag do streamu jakožto primární tag.}
// tagStream je
jméno streamu pro uložení tagu
// majorVer/minorVer jsou čísla verzí
tagu (liší-li se od původních)
// tagLoc umístění tagu ve streamu
(liší-li se od původního)
function kill: byte;
//Kompletně odstraní
tag se souboru
Knihovna dále obsahuje celou řadu funkcí a metod pro zpracování dalších sekcí tagu, jako například flagů v hlavičkách, jednotlivých rámců, komprese, kódování, synchronizace a mnoha dalších, nicméně nemá asi smysl se jimi podrobně zabývat. Za týden si ukážeme práci s knihovnou prakticky.
Dnešní článek ukázal jednu z možností, jak zpracovávat ID3v2 tagy. Představili jsme si knihovnu vytvořenou Jamesem Webbem, která usnadňuje práci s ID3v2 tagy v prostředí Delphi a která přitom obsahuje celou řadu metod a funkcí pro zpracování jednotlivých vlastností nabízených technologií ID3v2.
Ukázali jsme si, kde knihovnu sehnat a jak ji použít. V příštím článku společně vytvoříme jednoduchý editor tagů ID3v2, který knihovnu využije.