Umíme to s Delphi: 143. díl – rámce ID3v2 tagu: dokončení

V dnešním článku se podíváme na některé další důležité informace o ID3v2 tagu. Z minulých dílů už toho víme hodně, dnes nás čeká kromě jiného pořadí rámců, formát časových údajů, jazyk rámců a podobně. Dokončíme přitom popis rámců ID3v2 tagu a povíme si, co nás čeká dále.

V dnešním pokračování našeho seriálu se podíváme dále hlouběji pod pokličku technologie, kterou se zabýváme již velmi dlouho: řekneme si některé další informace o struktuře ID3v2 tagu. Dokončíme přitom povídání o nejdůležitější součásti celého tagu, a to o datových rámcích.

Začneme opět shrnutím toho, co o ID3v2 tazích už víme. Jedná se o technologii, pomocí které je možné rozšířit hudební (nebo obecně jiné audiovizuální) MP3 soubory o textové nebo binární informace obsahující informace o skladbě. Do těchto informací můžeme přitom díky konstrukci technologie ID3v2 zařadit i věci jako fotografie interpretů nebo autorů apod.

ID3v2 tag je značným rozšířením ID3v1 tagu, kterým jsme se zabývali před časem. Umožňuje obohatit skladby o mnohem víc informací než první verze, není pevně strukturně vymezen a nemá pevně stanovenou velikost ani pozici v souboru.

Ve třech předchozích článcích jsme se podrobně zabývali strukturou a formátem tagu jako takového. Vycházeli jsme přitom ze specifikace uvedené na URL http://www.id3.org/id3v2.4.0-structure.txt.

Na úvod se podívejme na to, co jsme si o technologii ID3v2 prozradili v předchozích dílech:

  • 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ů, pokračovat budeme (a téma dokončíme) dnes.

Předtím, než začneme samotnou náplň dnešního článku, zopakujeme si obecnou strukturu ID3v2 tagu. Tag vypadá přibližně 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Á)        |
+--------------------------------------+

Dnes se budeme zabývat "prostřední" součástí tagu, tedy datovými rámci. Před týdnem jsme si o nich už prozradili, že:

  • rámce jsou rozčleněny do vnitřních sekcí,
  • rámec začíná hlavičkou, která vypadá takhle:

Frame ID $xx xx xx xx (čtyři znaky)
Size 4 * %0xxxxxxx
Flags $xx xx

  • důležitou součástí jsou flagy, které nastavují informace o rámci a dělí se do dvou skupin (první a druhý bajt): na flagy popisující status rámce a na flagy popisující formát rámce

Dnes si povíme zbývající obecné informace o rámcích.

Zbývající informace o rámcích

Podívejme se na to, co ještě o datových rámcích nevíme.

Pořadí rámců

Především: neexistuje žádné pevně stanovené pořadí, v němž se rámce objevují v tagu. Pořadí rámců je z definice libovolné a parser musí být schopen si s tímto požadavkem poradit.

Přesto však lze nalézt několik pravidel, které by měly (ne povinně, ale dobrovolně) být dodržovány. Především platí, že rámce by měly být uspořádány podle jejich důležitosti, tedy podle toho, jak důležité informace obsahují. Jinak řečeno, parser by měl nalézt nejprve nejdůležitější informace a potom ty méně důležité. Mezi důležité informace určitě patří název alba, jméno interpreta, název stopy apod. - tyto údaje by měly být uloženy v prvních rámcích.

Počet rámců

Každý tag z definice musí obsahovat alespoň jeden rámec. Rámec přitom z definice musí být alespoň jeden bajt dlouhý (tato velikost je po odečtení velikosti hlavičky, která se nezapočítává).

Kódování

Není-li stanoveno jinak, řetězce (včetně číselných řetězců a adres URL) jsou reprezentovány jako znaky v kódování ISO-8859-1 v rozsahu $20 až $FF. Takové řetězce jsou v popisu rámce reprezentovány jako <textový řetězec>, a nebo <plný textový řetězec> v případě, že jsou povoleny znaky konce řádku.

Znaky konce řádku jsou však implicitně zakázány. Není-li řečeno jinak, nejsou znaky konce řádku povoleny. Pokud jsou povoleny, jsou v kódování ISO-8859-1 reprezentovány jako znak $0A.

Jak jsme si řekli minule, rámce povolující odlišné kódování obsahují tzv. "text encoding description byte", tedy bajt popisující metodu kódování textu. Podle hodnoty tohoto bajtu poznáme, které kódování bylo použito. Možné hodnoty:

  • $00 - použito kódování ISO-8859-1
  • $01 - použito kódování Unicode UTF-16
  • $02 - použito kódování Unicode UTF-16B
  • $03 - použito kódování Unicode UTF-8

Řetězce závislé na kódování jsou v popisu rámce reprezentovány jako <textové řetězce závislé na kódování>, a nebo <plné textové řetězce závislé na kódování> v případě, že jsou povoleny znaky konce řádků.

Zde vidíme jeden z důvodů velké flexibility ID3v2 tagu. Vzhledem k tomu, že můžeme nastavit kódování Unicode, je možné používat uvnitř rámce v podstatě libovolný jazyk. Jazyk je navíc možné nastavit pro každý rámec jednotlivě, proto nám v zásadě nic nebrání používat víc jazykových verzí textů apod. Právě tato vlastnost činí z ID3v2 velmi silnou technologii.

Časové údaje

Časové údaje (tzv. časová razítka, timestamps) jsou založeny na formátu specifikovaném v ISO 8601. Formát časových údajů pro maximální přesnost je yyyy-MM-ddTHH:mm:ss, kde:

  • yyyy znamená rok
  • MM znamená měsíc
  • dd znamená den
  • písmeno "T" je oddělovačem datumu a času
  • HH - hodina z čtyřiadvacetihodinového rozsahu
  • mm znamená minutu
  • ss znamená sekundu

Pokud nepotřebujeme časový údaj v plné přesnosti, lze z tohoto schématu odebírat položky až do okamžiku, kdy nám výsledek vyhovuje. Jinak řečeno, nemusíme vždy využívat celou přesnost, kterou máme k dispozici ve výše uvedeném schématu.

K platným formátům časového údaje tedy kromě výše uvedeného patří i celá řada dalších. Můžeme využívat následující (vzniklé nevyužitím některých součástí schématu):

  • yyyy
  • yyyy-MM
  • yyyy-MM-dd
  • yyyy-MM-ddTHH
  • yyyy-MM-ddTHH:mm
  • yyyy-MM-ddTHH:mm:ss

Jazyk

Některé rámce mohou obsahovat také tři bajty určené k popisu jazyka použitého v obsahu rámce a v textových údajích. Definice této technologie (tříbajtové určení jazyka) je uvedeno ve standardu ISO-639-2. Zmíněné tři bajty by měly být vždy napsány malými písmeny. Pokud není jazyk znám, měly by být použity znaky "xxx".

URL

Všechna URL, ať už internetová nebo lokální, mohou být relativní, můžeme tedy použít například adresu "picture.png" nebo "../dokument.txt" apod.

Delší rámce

V případě, že by se stalo, že rámec je delší než by měl být, případně že by měl více polí než je specifikováno ve výše zmíněném dokumentu (a tedy v příslušných dílech našeho seriálu), znamená to, že rámec byl rozšířen o informace specifikované pozdějšími verzemi standardu ID3v2. Mělo by to však být v každém případě reflektováno číslem revize v hlavičce tagu.

O rámcích víme vše

Tolik k popisu rámců uvnitř ID3v2 tagu. Řekli jsme si o nich už vše, co mělo být řečeno, prozkoumali jsme jejich náplň i popisné informace (flagy apod.).Specifikace je poměrně rozsáhlá, nezkoumali jsme ji úplně celou, ale zároveň jsme ani nevynechali žádné důležité informace. Nyní byste tedy měli mít povšechnou informaci o tom, jak takový rámec ID3v2 tagu vypadá, kde se nachází, čím je předcházen a co obsahuje.

Je zřejmé, že vyvstává celá řada implementačních otázek, jejichž zodpovězení je podstatně komplikovanější a náročnější než zodpovězení týchž otázek v případě starší technologie ID3v1. Tak to ale bývá, vyšší možnosti jsou vykoupeny vyšší náročností a implementační složitostí. Nic však není nemožné, jak si ukážeme v příštích dílech.

Na závěr

Dnešní článek vysvětlil některé další informace, které jsme dosud nevěděli o náplni rámců v technologii ID3v2. Ukázali jsme si, jaké je pořadí rámců, jakým způsobem formátovat časové značky, jak si poradit s kódováním textových řetězců a jak zaznamenat jazyk použitý v obsahu rámce. Dokončili jsme povídání o nejdůležitější součásti ID3v2 tagu - o datových rámcích.

Je vidět, že technologie ID3v2 je velmi silná a umožňuje do rámce zaznamenat celou řadu informací. Je pravdou, že MP3 přehrávače podporující tuto druhou verzi tagu jsou ve značné výhodě oproti starším produktům podporujícím pouze první verzi tagu, která (jak jsme si před časem uvedli) umožňovala uchovat jen velmi omezené množství údajů, navíc velice krátkých. Skutečnost je ovšem na druhou stranu taková, že zdaleka ne všechno, co technologie ID3v2 umožňuje, je konzistentně využíváno. To ovšem není problémem technologie.

Ještě předtím, než se pro dnešek rozloučíme, bych rád nastínil další směřování tohoto seriálu. Popis ID3v2 tagů se úspěšně prodlužuje a už velmi dlouho jsme se nezabývali žádnou praktickou implementací ani žádnou aplikací. Brzy to však napravíme.

V příštím díle bych rád dokončil teoretický popis ID3v2, zbývá nám už vlastně jen dvojice důležitých informací, a těmi jsou pozice tagu v MP3 souboru a dále dříve zmíněný mechanismus "unsynchronization".

Tím definitivně dokončíme teoretický popis ID3v2 technologie. Jak jsme naznačili výše, implementační otázky jsou trochu obtížnější, přesto bych se jim nerad vyhnul. Pokusíme se tedy společně napsat nějakou praktickou aplikaci, která umožní využívat technologii ID3v2. Uvidíme, jestli se nám to podaří :-)

Váš názor Další článek: Intel právě zveřejnil detaily o dvoujádrovém Pentiu Extreme Edition

Témata článku: Software, Programování, Unicode, Apod, Druhý případ, ID3, První případ, Důležitý údaj, DEL, Plný text, Důležitá součást, Praktická implementace, Znak, DDT, Dokončení, Maximální přesnost, Nejdůležitější otázka, Struktura, První článek, Tag, Součást, Libovolný jazyk, Dok, Rámec, Rám


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



Aktuální číslo časopisu Computer

Test 9 bezdrátových reproduktorů

Jak ovládnout Instagram

Test levných 27" herních monitorů

Jak se zbavit nepotřebných věcí na internetu