Umíme to s Delphi: 145. díl – praktická implementace ID3v2 tagů

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:

  • díl 136 se zabývá obecným popisem ID3 tagů jako takových,
  • náplní dílu 137 je praktická implementace podpory ID3 tagů v programech,
  • také díl 138 se zabývá praktickou implementací, tentokráte modifikací ID3 tagů,
  • díl 139 potom podrobně rozebírá druhou verzi tagů (ID3v2) a shrnuje rozdíly mezi jednoduchou první a sofistikovanou druhou verzí,
  • díl 140 je věnován specifikaci formátu a struktury hlavičky ID3v2 tagů,
  • díl 141 je dalším pokračováním rozboru struktury ID3v2 tagu, konkrétně pak popisuje rozšířenou hlavičku, padding a patičku,
  • díl 142 popisuje hlavní součást ID3v2 tagu, a to datové rámce. Tento díl je vlastně první částí popisu datových rámců, jehož ¨pokračování je uvedeno v
  • dílu 143 zveřejněného před týdnem. Ve 143. dílu najdete především popis věcí jako pořadí rámců, počet rámců, kódování apod.
  • díl 144 uzavírá celé manévry a zabývá se zbývajícími věcmi jako především umístění tagu v souboru nebo mechanismem tzv. unsynchronizace.

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 implementovat podporu ID3v2 tagů

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

Jaké implementace jsou k dispozici?

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 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í:

  • C a C++
  • Java
  • Perl
  • existují také komponenty ActiveX
  • Borland Delphi.

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

  • plná podpora load a save funkcí pro tagy ID3v2.3.0
  • plná podpora load a save funkcí pro tagy ID3v2.4.0
  • vytváření nových tagů
  • odstraňování tagů ze souborů
  • unsynchronizace
  • komprese
  • rozšířené hlavičky i výplně (padding)
  • podpora kódování Unicode
  • přístup ke všem hlavičkám, a to jak celého tagu tak i jednotlivých rámců
  • funkce pro formátování rámců

Knihovna ID3v2 pro Delphi - stažení a instalace

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.

Podporované funkce a rozhraní

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.

Závěrem

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.

Váš názor Další článek: Finální Opera 8.0 je venku

Témata článku: Software, Programování, Unicode, Tag, Praktická implementace, Unita, Původní funkce, Byte, DEL, Celá knihovna, Díl, Poslední pokračování, Dnešní shrnutí, Delphi, Jednoduché rozšíření, Stream, Flag, Speciální druh, Struktura, James Webb, Původní objekt, Hlavní funkce, Implementace, Hlavní náplň, Save


Určitě si přečtěte

Chrome se naučí dokonale odkazovat. Jeho odpůrci bijí na poplach, prý je to bezpečnostní katastrofa

Chrome se naučí dokonale odkazovat. Jeho odpůrci bijí na poplach, prý je to bezpečnostní katastrofa

** Google zavádí techniku ScrollToTextFragment ** Umí vytvořit odkaz na konkrétní slovo na stránce ** Podle kritiků by to mohl být bezpečnostní problém

Jakub Čížek | 41

Co je TikTok: Svérázná sociální síť chytla mladé uživatele, už jich má už 1,5 miliardy

Co je TikTok: Svérázná sociální síť chytla mladé uživatele, už jich má už 1,5 miliardy

** Sociální síť TikTok získala stamiliony uživatelů a stále roste ** Jaký obsah na ní najdete a co můžete v jejím rámci čekat? ** Je to zábava pro mladé, nebo platforma pro úchyláky?

Karel Kilián | 38

12 nejšílenějších programovacích jazyků, ze kterých vám praskne hlava

12 nejšílenějších programovacích jazyků, ze kterých vám praskne hlava

** Myslíte si, že umíte programovat? ** Ale prosím vás, zkuste jazyk Wenyan nebo Malbolge ** Z ezoterických jazyků zešílíte, nebo vás zaměstnají v Googlu

Jakub Čížek | 25

Vyzkoušeli jsme TP-Link Deco P9: zajistí doma Wi-Fi díky drátům ve zdi

Vyzkoušeli jsme TP-Link Deco P9: zajistí doma Wi-Fi díky drátům ve zdi

** Nová generace Mesh Wi-Fi s propojením přes elektrické rozvody ** Lepší parametry a nižší cena než u předchůdce ** Aplikace zatím podporuje jen základní nastavení bez rozšířených funkcí

Tomáš Holčík | 25

17 užitečných tipů a triků pro Mapy Googlu, které byste měli znát

17 užitečných tipů a triků pro Mapy Googlu, které byste měli znát

** Mapy Googlu mají spoustu funkcí, které jsou často přehlíženy ** Využijte například podrobnější možnosti plánování cest ** Hodit se mohou i tipy na sdílení nebo pohledy do minulosti

Karel Kilián | 25



Aktuální číslo časopisu Computer

Megatest 12 bezdrátových sluchátek

Vyplatí se Apple z bazaru?

Test batohů pro notebooky

Vybíráme nejlepší sportovní hodinky