Umíme to s Delphi: 136. díl – ID3 tagy: co to je?

Dnešní díl seriálu pokračuje v popisu problematiky souborů MP3. Dnes se nezaměříme ani tak na hudbu samotnou, jako spíše na způsob, jak obohatit hudební soubory MP3 o textové informace nesoucí informace o názvu skladby, jménu interpreta nebo názvu alba. Vysvětlíme si, jaké jsou v současnosti dostupné verze tagů ID3, jaký je mezi nimi rozdíl, a co všechno vlastně ID3 tag dokáže uložit.

Minulý díl našeho seriálu se zabýval tím, jak pracovat s MP3 formátem v Delphi, přesněji řečeno, jak jednoduše v Delphi vytvořit jednoduchý přehrávač empétrojek. Vysvětlili jsme si, že komponenta MediaPlayer, která je s Delphi standardně dodávána, dokáže empétrojky přehrát (za předpokladu, že v systému existuje příslušný plugin, což je však prakticky vždy splněno) a že její použití, i když občas přináší některé problémy, je velmi jednoduché a přímočaré.

V dosavadních článcích na téma MP3 jsme se však vždy zabývali jen hudbou jako takovou. Formát MP3 však umožňuje připojit k souboru kromě „hudebních“ informací ještě krátký text – tzv. Tag, s jehož pomocí lze jako součást souboru uchovat i informace o názvu skladby, jménu autora, názvu alba apod.

Popis ID3 tagů je trochu komplikovanější než by se na první pohled zdálo, protoe vedle sebe existují dvě verze standardu – ID3 verze 1 (ID3v1) a ID3 verze 2 (ID3v2). Tyto standardy se od sebe poměrně výrazně liší, a proto si je dnes odděleně popíšeme a vysvětlíme. Začneme však, jak je naším zvykem, obecným popisem úplných základů.

ID3 pro začátečníky – co to je a jak s tím pracovat?

Tagy ID3 představují cestu, jak obohatit hudební soubory MP3 o textové informace. Díky existenci tagů MP3 si můžeme užívat funkce, které nám dnes všechny MP3 přehrávače už snad bez výjimky nabízí – totiž číst si při přehrávání skladby její název, ale také jméno autora a interpreta, název alba, rok vydání, žánr apod. Díky existenci těchto informací v MP3 souboru můžeme empétrojky snadno vyhledávat a prohledávat.

ID3 tagy se nejsnadněji do skladby vkládají přímo při jej tvorbě. Drtivá většina programů vytvářejících empétrojky umožňuje zadat požadované informace do příslušných dialogových okének a následně je automaticky připojí k vytvářené empétrojce. Ještě častěji jsou ID3 tagy vloženy do empétrojky zcela automaticky – například při grabování cédéčka pouze zaškrtneme příslušné políčko kdesi v nastavení grabovače a on se sám postará o vytvoření textových informací (nejčastěji na základě informací, které zná o grabovaném CD) a o jejich připojení do následně vyráběné empétrojky.

Celý proces lze ještě dále zjednodušit – pokud má grabovač přístup na internet a zná některé internetové databáze (CDDB apod.), dokáže sám všechny potřebné informace najít, takže ve výsledku stačí pouze vložit CD do mechniky a zapnout grabovač s MP3 konverterem; dále se již klávesnice nemusíme ani dotknout a za několik minut máme hotové empétrojky obsahující kompletní informace o jednotlivých skladbách.

Potřebujeme-li později ID3 tag v empétrojce změnit, existuje k tomu celá řada programů, které takovou operaci umožňují. Namátkou zmiňme např. známý WinAMP, velmi dobrý Tag & Rename, freewarový MP3 Internet Renamer, rozšiřující se iTunes apod.

Takže závěrečné shrnutí: ID3 tagy je kousek textových dat, který je připojen k souboru MP3 (podle verze ID3 tagu obvykle buď na začátek nebo na konec empétrojky) a který slouží k uchování informací o interpretovi, názvu skladby, názvu alba, roku vydání skladby a žánru dané skladby. ID3 tag je v současnosti připojen k drtivé většině empétrojek. Velikost ID3 tagu je opět závislá na použité verzi – ID3 tag verze 1 má vždy velikost 128 bajtů, ID3 tag verze 2 nemá pevně stanovenou velikost.

Stručná histori ID3 tagů aneb jak to všechno začalo

Předtím, než se vrhneme na technický popis tagů, podíváme se stručně na to, jak a proč tato technologie vlastně vznikla.

Před dvěma týdny jsme se zabývali principe empétrojek a tím, jak chytrý nápad („lidské ucho není tak dobré, jak si všichni myslíme“) dokáže uspořit megabajty diskového prostoru na každé skladbě. Poté, co tato myšlenka vedla k vytvoření formátu MP3 a poté, co se - díky svým výborným parametrům – empétrojky rozšířily bezmála jako standard pro uchovávánjí digitální hudby, bylojen otázkou času, kdy někoho dalšího dostihne jiný chytrý nápad: totiž že kdybychom dokázali rozšířit hudební soubor o textové informace uchovávající klíčové údaje o písničce, praktická využitelnost empétrojek by se ještě znásobila.

Tento nápad dostal (alespoň podle dostupných pramenů) Eric Kemp alias NamkraD v roce 1996. Přesněji řečeno, přišel s vizí fixně (128 bajtů) dlouhého údaje, který by mohl být připojen na úplný konec audiosouboru a který by dokázal všechny požadované informace uchovat. Implementovat tento koncept nebylo zřejmě nijak obtížné, prostě stačilo stanovit formát tagu a tag připojit na konec jakékoliv skladby.

Následně se objevila celá řada lidí, kteří tento koncept dále rozšířili a vylepšili. Například Michael Mutschler, autor standardu MP3ext, rozšířil tento standard o možnost uložit do tagu informaci o CD stopě, z níž daná skladba pochází. Tak například vznikla verze ID3v1.1.

Tag ID3v1.1 však stále měl řadu nedostatků, zejména podporu jen základnich informací (autor, název, album, rok, žánr, stopa), navíc s omezenou délkou informací. Představte si například, že bychom do 128bajtového tagu chtěli uložit informace o skladbě "P.I. Tchaikovsky`s Nutcracker Suite Op. 71 a, Ouverture miniature danses caractéristiques by The New Philharmonic Orchestra, London, conducted by Laurence Siegel".

První verze ID3 tagů měly však i další nedostatky: například ten, že tag byl umístěn na konci MP3 souboru. Jinak řečeno, je to ta poslední věc, na kterou se dostane řada při streamování souboru. To může za určitých okolností být na škodu – při streamování empétrojky se nedozvíte žádné informace předtím, než ji nastreamujete celou.

Pevná délka 128 bajtů je zároveň pojistkou proti jakémukoliv dalšímu rozšiřování tagu a jím přenášených informací. Ze všech těchto důvodů si mnoho lidí myslelo, že by neuškodil nový standard, který by umožňoval všechno, co první verze, ale nabízel by větší volnost a širší možnosti.

Hlavní postavou v tomto směru byl Martin Nilsson, který společně se svými spolupracovníky dal vzniknout druhé verzi formátu ID3 – ID3v2. V současnosti je aktuální verze ID3v2.4.0.

První verze – tagy ID3v1

Začněme však postupně a podívejme se podrobně na ID3 tag verze 1. Jeho použití, stejně jako implementace jeho podpory je podstatně jednodušší a v našich následných ukázkových aplikacích se budeme věnovat právě jemu.

Jak jsme uvedli výše, Eric Kemp v roce 1996 přišel s nápadem připojit malý, 128 bajtů dlouhý kousek dat na konec MP3 souboru a umožnit tak empétrojce nést si s sebou informace o své skladbě. Důvod, proč byl tag umístěn na konec empétrojky, spočíval zřejmě ve snaze neznesnadnit život aplikacím uvyklým na standardní formát empétrojek.

Podívejme se nejprve na formát tagu:

Údaj Délka (počet bajtů)
Název skladby 30 znaků (bajtů)
Jméno interpreta 30 znaků (bajtů)
Název alba 30 znaků (bajtů)
Rok vydání 4 znaky (bajtů)
Komentář (další údaje) 30 znaků (bajtů)
Žánr 1 bajt

Klíčový je fakt, že tag je umístěn na konci empétrojky, v MP3 souboru jsou tedy informace uspořádány následnovně:

Audio data – ID3 tag

Pokud si pozorný čtenář dá tu práci a sečte bajty uvedené v pravém sloupečku tabulky, dospěje k součtu 125 bajtů, nikoliv 128. Kde jsou chybějící tři znaky, ptáte se? Neztratily se, jsou uvedeny na samotném začátku tagu, ještě před začátkem skladby. Jejich obsahem jsou tři písmena „TAG“, jakožto identifikace pro přehrávače a další software říkající: „od tohoto místa už nejsou uloženy hudební informace, nýbrž textový tag“. Jinak řečeno: nejjednodušší cesta, jak si ručně ověřit, zda empétrojka obsahuje tag (verze 1 nebo 1.1), je zkusit v ní vyhledat řetězec „TAG“. Kontrolou je, že tento řetězec musí vždy ležet 128 bajtů zpět od konce souboru.

Další otázka může znít: jak chcete uložit žánr skladby (tedy textovou informaci) do jednoho jediného bajtu? Odpověď je opět prostá: na pomoc si vezmeme jakýsi seznam žánrů (autor standardu, Eric Kemp, vytvořil seznam 80 předdeinovaných formátů) a do ID3 tagu uložíme pouze index daného formátu v tomto předdeefinovaném seznamu. Z toho plyne nekolik důsledků:

  • vzhledem k tomu, že seznam žánrů není nijak dlouhý a rozhodně obsahuje méně než 256 položek, stačí nám pro uložení žánru jeden bajt (na osmi bitech lze uložit číslo 0 – 255),
  • jakýkoliv program zpracovávající ID3 tagy však musí obsahovat svou vlastní kopii tohoto standardního seznamu žánrů. Pokud program tento seznam nezná, nemá žádnou šanci, jak se dozvědět, o který žánr se jedná, protože v empétrojce je uložen jen jeho index.

Seznam žánrů , původně čítající 80 položek, je v současnosti dále rozšířen a nikde není psáno, že se nebude rozšiřovat i nadále. V ukázkové implementaci si jej později ukážeme.

Poslední informace, kterou pro ID3v1 stojí za to uvést, souvisí s pevně stanovenou délkou položek. Pakliže máme stanovenu délku 30 znaků pro jméno autora nebo pro název skladby, jistě se dříve či později dostaneme do situace, v níž budeme potřebovat uložit kratší nebo delší informaci. Jak se s tím standard vypořádává? V zásadě nijak:

  • je-li informace delší než dostupných 30 znaků, máme smůlu, je prostě oříznuta, znaky od 31. výše nelze nijak uložit,
  • je-li informace kratší než dostupných 30 znaků, standard definuje požadavek vyplnit zbývající, nevyužité pozice binárními nulami. Není tedy možné například zapsat do nevyužitých pozic v kolonce „autor“ název skladby ani cokoliv jiného.

Než si ukážeme Delphi implementaci tagu, podíváme se stručně na další verzi tagu – ID3v1.1.

Další průběžná verze – ID3v1.1

O několik odstavců výše jsme si uvedli, že tag ID3v1 byl později rozšířen o další položku umožňující uchovávat CD stopu, z níž skladba pochází. Proč se to stalo?

První verze tagu byla skvělá pro programátory, protože její podpora se nesmírně snadno implementovala (jak si později ukážeme). Vzhledem k pevné délce položek však nepřipadalo v úvahu žádné rozšíření, pakliže jsme chtěli zachovat zpětnou kompatibilitu. Jinak řečeno – rozšířit standard můžete jak chcete, ale stávající software vám na kterémkoliv rozšíření spadne, protože s ním nebude kompatibilní.

Michael Mutschler však vymyslel cestu, jak stávající formát rozšířit tak, aby mohl nést jednu dodatečnou informaci a přitom aby zachoval kompatibilitu se starším softwarem připraveným pouze pro verzi ID3v1.

Michael vzal v úvahu následující informace:

  • standard říká, že nevyužité bajty ve všech položkách mají být vyplněny binární hodnotou nula. To znamená, že veškerý software zpracovávající tagy přestane položku číst v okamžiku, kdy dojde k binární nule, protože předpokládá, že po ní už nic smysluplného nenásleduje,
  • pole pro uložení komentáře (30 znaků) je tak krátké, že stejně neumožňuje uložit nic smysluplného, a proto nevadí, když jej ještě trochu zkrátíme.

Ve výsledku Michal vymyslel tohle: zkrátíme pole pro Comment na 28 bajtů, 29. bajt tohoto pole nastavíme vždy na binární nulu a 30. bajt tohoto pole využijeme pro uložení čísla CD stopy, z níž skladba pochází (ve své podstatě číslo skladby na zdrojovém CD).

Výsledek bude takový, že stávající software sice číslo CD stopy nepřečte, ale také to jeho funkci nijak neomezí (software prostě v poli Comment dojde dříve nebo později – nejpozději na 29. znaku – k nule a přestane číst) a nové aplikace mohou být navrženy tak, že budou vědět, že 30. znak v poli Comment mají vždy přečist, protože obsahuje číslo CD stopy. Chytré, že?

Jinak řečeno, ID3v1.1 má následující strukturu:

Údaj Délka (počet bajtů)
Název skladby 30 znaků (bajtů)
Jméno interpreta 30 znaků (bajtů)
Název alba 30 znaků (bajtů)
Rok vydání 4 znaky (bajtů)
Komentář (další údaje) 38 znaků (bajtů)
Číslo CD stopy 2 znaky (první je 0)
Žánr 1 bajt

Verze 1.1 je určitým vylepšením, ale asi sami uznáte, že to pořád ještě „není ono“. Přesto, první dvě verze tagů se dlouho úspěšně používaly (a dále používají) a ve většině běžných situací bohatě postačují. Obecně však nejsou nikterak flexibilní a neumožňují uložit vše, co bychom obvykle potřebovali. Proto později vznikla další, druhá „velká“ verze – ID3v2.

Protože jsme se však dnes dostali až na samotný konec článku, budeme pokračovat příště. Začneme tím, že se společně podíváme na implementaci ID3v1 tagů v Delphi, a následně budeme pokračovat popisem verze ID3v2.

Na závěr

Dnešní článek byl úvodem do problematiky ID3 tagů. Stručně jsme se podívali na historii a důvody vzniku standardu ID3, vysvětlili jsme si, jaké jsou v současnosti existující verze a podívali jsme se podrobně na zoubek prvním dvěma verzím – ID3v1 a ID3v1.1. V přístím dílu budeme pokračovat – zaměříme se na implementaci ID3 tagů v Delphi a podíváme se také na další hlavní verzi standardu – na ID3v2.

Diskuze (1) Další článek: Microsoft zdvojnásobil zisky

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