ID3 Tag v2

fatalbomb

Artykuł ten opisuje budowę znaczników ID3 Tag v2. Może być podstawą do stworzenia własnego modułu do ich odczytywania i zapisywania. Nie podaje (przynajmniej na razie) gotowego kodu czy rozwiązania.

Historia

Kiedy format MP3 opuścił laboratorium Fraunhofera, był surowym formatem audio, niezawierającym jakiejkolwiek informacji o treści zawartej w pliku. Jedynym możliwym opisem była nazwa pliku. Dlatego też w 1996 roku stworzono znacznik ID3, mający na celu umożliwienie opisania zawartości pliku.

Strukturalnie ID3 Tag to 128-bajtowy ciąg rozpoczynający się od napisu "TAG", zawierający informację o wykonawcy, tytule i albumie utworu wraz z komentarzem, rokiem powstania i nazwą gatunku muzycznego. W późniejszym czasie pole komentarza skrócono o dwa bajty i wstawiono do wyciętego fragmentu numer ścieżki (poprawka ta przeszła do historii pod nazwą ID3 Tag v1.1). Blok ten był doklejony na końcu pliku, za danymi audio.
W polu gatunku muzycznego przechowywano kod tego gatunku na jednym bajcie. W pierwszej specyfikacji było ich zdefiniowane 80, później twórcy Winampa rozszerzyli listę do 148 pozycji.

Na pewno zwróciłeś uwagę, że niektóre odtwarzacze (między innymi biblioteka Bass) przy niektórych plikach MP3 generują dziwny odgłos na samym końcu utworu. Jest to efekt próby przetworzenia tak doklejonego taga jako danych audio.

ID3 Tag v1.x był daleki od doskonałości. Stała długość pól była największą przeszkodą, ale nie jedyną. W przewidzianych 30 bajtach nie mieściły się niektóre nazwy albumów. Poza tym tekst mógł być kodowany jedynie w ISO-8859-1, zamknięta została droga do umieszczania tam nazw inne niż angielskie, ewentualnie niemieckie, szwedzkie, duńskie, itd. Kolejną wadą było to, że nie można było użyć ID3 do opisywania danych przesyłanych w postaci transmisji strumieniowej (np. radia internetowego).

Krytyka ID3 Tag v1.x spowodowała rozpoczęcie prac nad wprowadzeniem lepszego standardu. W 1998 roku powstaje ID3 Tag v2, który pomimo nazwy jest całkowicie niekompatybilny z poprzednikiem. W trakcie rozwoju i poprawiania powstają kolejne wersje techniki, aż do ukazania się ID3 Tag v2.4 (oficjalnie opublikowanego 1 listopada 2000 roku). ID3 Tag v2.4 powszechnie utożsamiany jest z ID3 Tag v2.

W ID3 v2 zrezygnowano ze stałych pól na rzecz pól zmiennych. Każda informacja składa się z czterobajtowego identyfikatora (pierwotnie 3-bajtowego), informacji o długości tekstu lub danych zawartych w polu i samej informacji, zajmującej dokładnie tyle miejsca, ile potrzeba.

Drugą ważną zmianą jest wstawienie tagów na początek pliku. Spowodowało to wprawdzie, że nowy standard nagle stał się niekompatybilny ze starymi odtwarzaczami. Nie jest to jednak obecnie duży problem - urządzeń i programów nieobsługujących znaczników ID3 v2 praktycznie nie ma w obiegu.
Nowy standard ponadto obsługuje wiele stron kodowych. Od wersji 2.4 możliwe stało się kodowanie w UTF-8, a wielokrotne wartości mogą być rozdzielane w obrębie pola znakiem pustym '\0' (wcześniej '').

Struktura

Aby sprawdzić, czy plik faktycznie posiada ID3 Tag v2.x, musimy sprawdzić pierwsze 10 bajtów pliku MP3 wg. wzorca: $49 44 33 yy yy xx zz zz zz zz ($ oznacza liczbę szesnastkową), gdzie:
  • pierwsze 3 bajty pliku MP3 to identyfikator "ID3",
  • yy - wersja tagu, liczba mniejsza od $FF (255 dziesiętnie)
  • xx - flaga
  • zz - rozmiar tagu bez nagłówka, liczba mniejsza od $80 (128 dziesiętnie)

Dla ułatwienia, można sprawdzić tylko 3 pierwsze bajty w poszukiwaniu ciągu ID3, czyli sekwencji $49 44 33.
Rozmiar tagu jest zapisany jako 32-bitowy synchsafe integer w Big Endian. Efektywnie można wykorzystać tylko 28 bitów, ponieważ pozostałe najbardziej znaczące bity są zawsze wyzerowane.
Dla przykładu liczba 255, która normalnie zajmuje 8 bitów %11111111, po zakodowaniu synchsafe integer będzie zapisana w 16-tu bitach i będzie miała postać %00000001 01111111 (najbardziej znaczący bit z pierwszego bajty został przesunięty w lewo).
Więcej o synchsafe znajdziemy na stronie Synchsafe i na stronie id3v2.4.0-structure.

Do przeczytania nagłówka za jednym zamachem przyda się zatem taki kod:
C++

struct ID3Header
{
 char id[3]; /* napis ID3 */
 unsigned char verMajor;
 unsigned char verMinor;
 unsigned char flags;
 unsigned long size;
};

Pascal/Delphi

type ID3Header = record
 id: Array [1..3] of Char;
 verMajor: Byte;
 verMinor: Byte;
 flags: Byte;
 size: Cardinal;
end;

Po przeczytaniu nagłówka dochodzimy do tego, co nas naprawdę interesuje, czyli remak zbudowanych w następującym formacie:

EtykietaDługość pola (n) Flagi Kodowanie znaków Informacja zawarta w tym polu
4 bajty4 bajty2 bajty1 bajtn bajtów
Pole Etykieta jest czterobajtowym ciągiem, określającym typ zawartej informacji. Przykładowe etykiety to:
  • `TIT2` - Tytuł utworu
  • `TPE1` - Wykonawca
  • `TENC` - Informacja o enkoderze
Długość pola jest 32-bitowym synchsafe Integerem, zapisanym w big endian (pierwszy bajt jest najbardziej znaczący). Należy zwrócić uwagę na to, że nie chodzi tu o długośćw sensie ilości znaków, a o ilość bajtów potrzebną do zapisania napisu w wybranym przez nas kodowaniu. Następne 2 bajty są flagami, następny bajt oznacza stronę kodową. Np. $0 oznacza ISO-8859-1, $3 - UTF-8. Po znaczniku kodowania następuje właściwa treść. Gdzieś jednak tagi muszą się kończyć. Za ostatnim rekordem trafimy zazwyczaj na bajt '\0', tzw. padding, jeśli był zapisany, ale nie należy na tym polegać. Do tego celu najlepiej wykorzystać informację o długości tagów (bajty 7-10 nagłówka) - i jest to w sumie rozwiązanie najbezpieczniejsze. Nie należy też za bardzo ufać informacjom zapisywanym przez rożne edytory. Zdarza się, że rozmiar tagu jest zapisany jako zwykły integer, nie synchsafe. W takim przypadku możemy nawet nadpisać dane z muzyką. Najbezpieczniejszym chyba sposobem, jest sprawdzić dodatkowo pozycję pierwszej ramki mp3, a zaczyna się ona sekwencją 11111111 111xxxxx (pliki CBR, czyli ze stałym bitrate). Z plikami VBR jeszcze nie miałem okazji pracować.

Zastosowanie praktyczne

Wielką zaletą ID3 v2 jest możliwość osadzenia własnych pól. Żaden odtwarzacz nie wyrzuci błędu po odczytaniu etykiety "`LOL2`", pod warunkiem, że rekord będzie zbudowany prawidłowo. Jeżeli chcemy osadzić własne informacje w pliku MP3, nic nie stoi na przeszkodzie, aby je tam dodać. Oczywiście prawdopodobnie trzeba będzie napisać edytor ID3 Tag v2, który wstawi takie pole.

Trzeba pamiętać o istotnej rzeczy: gdy trafimy na pole przechowujące nazwę gatunku, możemy zamiast zrozumiałego ciągu natknąć się na liczbę w nawiasie. Jest to kod gatunku, taki sam, jaki jest używany w ID3 v1. W tym wypadku trzeba zamienić liczbę na odpowiedni tekst

Podsumowanie

Powyższy artykuł nie porusza wszystkich zagadnień, jakie dotyczą tematyki ID3 Tag. Podane informacje wystarczą jednak, aby samemu napisać własny moduł czytający i piszący znaczniki ID3 Tag v2.x.

Przykładowe etykiety rekordów

EtykietaZnaczenie
`AENC`Informacja o enkoderze audio
`APIC`Obrazek jako załącznik
`TIT2`Tytuł utworu
`TPE1`Główny wykonawca
`TPE2`Grupa wykonująca utwór
`TPE3`Dyrygent/Lider
`TPE4`Remiksujący, przerabiający, modyfikujący, itp.
`TALB`Album
`TBPM`Tempo (w BPM)
`TCOM`Kompozytor
`TCON`Informacja o treści
`COMM`Komentarz
`TYER`Rok
`TRCK`Ścieżka (zazwyczaj w formacie aa/bb, gdzie bb oznacza całkowitą liczbę ścieżek na ripowanej płycie CD)
`TCON`Gatunek
`TLAN`Język
`TLEN`Długość
`TSIZ`Rozmiar
`WXXX`Strona WWW twórcy/dystrybutora
`TENC`Informacja o enkoderze (np LAMEEnc dostawia tam informację o użytej metodzie konwersji)
`TCOP`Informacja o prawach autorskich (to nie jest DRM!!!)

Kody gatunków muzycznych

KodZnaczenieKodZnaczenie
0 Blues 40 Alternative Rock
1 Classic Rock41 Bass
2 Country42 Soul
3 Dance43 Punk
4 Disco44 Space
5 Funk45 Meditative
6 Grunge46 Instrumental Pop
7 Hip-hop47 Instrumental Rock
8 Jazz48 Ethnic
9 Metal49 Gothic
10New Age50 Darkwave
11Oldies51 Techno Industrial
12Other52 Electronic
13Pop53 Pop Folk
14R&B54 Eurodance
15Rap55 Dream
16Reggae56 Southern Rock
17Rock57 Comedy
18Techno58 Cult
19Industrial59 Gangsta
20Alternative60 Top 40
21Ska61 Christian Pop
22Death Metal62 Pop Funk
23Pranks63 Jungle
24Soundtrack64 Native American
25Euro Techno65 Cabaret
26Ambient66 New Wave
27Trip-hop67 Psychadelic
28Vocal68 Rave
29Jazz Funk69 Showtunes
30Fusion70 Trailer
31Trance71 Lo-Fi
32Classical72 Tribal
33Instrumental73 Acid Punk
34Acid74 Acid Jazz
35House75 Polka
36Game76 Retro
37Sound Clip77 Musical
38Gospel78 Rock&Roll
39Noise79 Hard Rock

6 komentarzy

Bardzo słaby art, choć można coś z niego wynieść.
Autor chciał coś napisać, ale chyba nie za bardzo wiedział o czym, wiec padło na tagi mp3.
"najniższe cztery bity" - co to za słownictwo? :) Albo najmłodsze bity, albo najstarsze, ale najniższe? To, które to będą?
Opisując coś, nie można pisać, że coś tam pomijamy, bo nie będzie potrzebne, tylko trzeba opisać, po co dane bity są. Używanie wyrażeń "w większości, zazwyczaj" nie powinny mieć miejsca, bo o ile nie będzie problemu z odczytaniem tagu, to co ma zrobić osoba, która zechce go zapisać, kiedy nie wie, do czego służą te niby niepotrzebne wg autora bity. Uważam, że jeśli się nie przygotowuje odpowiednio do napisania artykułu, to nie powinno go się w ogóle zaczynać.
Nie rozumiem tez dołączonego kodu, czemu ma służyć, jeśli nie jest wykorzystany. W takim wypadku, wystarczająca jest zwykłą tabelka z podaniem pól, ich długości i typu.

Pozdrawiam :)

Wypadałoby wspomnieć o bibliotekach do obsługi id3 - najlepsza jaką widziałem to id3lib (http://id3lib.sourceforge.net/) - obsluguje praktycznie całość standardu id3v2.
Warto bylo tez napisac o innych standardowych polach używanych w 2 wersji id3 - takich jak chociażby obrazek okładki (kilka rozdzajów), słowa, oryginalny wykonawca, wydawca albumu itd... oraz o tym, ze mozliwosc osadzania dowolnyh elementów w pliku mp3 (np. obrazków) spotyka się nieraz z krytyką i ma wiecej przeciwnikow niz zwolennikow, a jedyny znany odtwarzacz, ktory obsluguje obrazki osadzone w pliku mp3 to Windows Media Player (ktorego do mp3 nikt nie uzywa)

pagosa747: racja ;-)
edit: poprawione

Jako, że pole długości jest liczbą 32-bajtową bez znaku (unsigned long), to teoretycznie zmieści się tam 4 GB (!) tekstu lub danych.

Czy nie powinno być " jest liczbą 32-bitową" ?

może jak znajdę chwilę wolnego to wrzucę. A znaczenie tego 6-bajtowego nagłówka spróbuję poszukać.
edit: OK, jest.

Ładnie napisane, ale rozszerzyłbym artykuł o pełną listę etykiet, listę gatunków wraz z ich numerami [jakoś kompaktowo to ścisnąć]. Bardzo złym nawykiem jest omijanie niektórych fragmentów nagłówka:

Następne 6 bajtów zawiera pewne informacje między innymi o kodowaniu (zazwyczaj pierwsze 4 bajty są znakami '\0'). W większości przypadków można je przeskoczyć.
to bym zamienił na opis, bo po coś jednak te pola są.

A tak to fajnie.