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:
Etykieta | Długość pola (n) | Flagi | Kodowanie znaków | Informacja zawarta w tym polu |
4 bajty | 4 bajty | 2 bajty | 1 bajt | n bajtów |
- `TIT2` - Tytuł utworu
- `TPE1` - Wykonawca
- `TENC` - Informacja o enkoderze
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
Etykieta | Znaczenie |
---|---|
`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
Kod | Znaczenie | Kod | Znaczenie |
---|---|---|---|
0 | Blues | 40 | Alternative Rock |
1 | Classic Rock | 41 | Bass |
2 | Country | 42 | Soul |
3 | Dance | 43 | Punk |
4 | Disco | 44 | Space |
5 | Funk | 45 | Meditative |
6 | Grunge | 46 | Instrumental Pop |
7 | Hip-hop | 47 | Instrumental Rock |
8 | Jazz | 48 | Ethnic |
9 | Metal | 49 | Gothic |
10 | New Age | 50 | Darkwave |
11 | Oldies | 51 | Techno Industrial |
12 | Other | 52 | Electronic |
13 | Pop | 53 | Pop Folk |
14 | R&B | 54 | Eurodance |
15 | Rap | 55 | Dream |
16 | Reggae | 56 | Southern Rock |
17 | Rock | 57 | Comedy |
18 | Techno | 58 | Cult |
19 | Industrial | 59 | Gangsta |
20 | Alternative | 60 | Top 40 |
21 | Ska | 61 | Christian Pop |
22 | Death Metal | 62 | Pop Funk |
23 | Pranks | 63 | Jungle |
24 | Soundtrack | 64 | Native American |
25 | Euro Techno | 65 | Cabaret |
26 | Ambient | 66 | New Wave |
27 | Trip-hop | 67 | Psychadelic |
28 | Vocal | 68 | Rave |
29 | Jazz Funk | 69 | Showtunes |
30 | Fusion | 70 | Trailer |
31 | Trance | 71 | Lo-Fi |
32 | Classical | 72 | Tribal |
33 | Instrumental | 73 | Acid Punk |
34 | Acid | 74 | Acid Jazz |
35 | House | 75 | Polka |
36 | Game | 76 | Retro |
37 | Sound Clip | 77 | Musical |
38 | Gospel | 78 | Rock&Roll |
39 | Noise | 79 | Hard Rock |
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
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:
A tak to fajnie.