Projekte > Audio-CD (CDDA) > ID3-Tags

Mit Id3-Tags speichern

  • Beschreibung
  • Versionen
  • ID3v2 Struktur
  • Header
  • Extended Header
  • Frames
  • Zeichenketten
  • Speicherort
  • Synchsafe Integer
  • Auswahl der Frames
  • Text Informations Frames
  • User Defined Text Information Frame (ab v2.3)
  • Attached picture
  • Beschreibung

    Wenn man eine Datenbank abfragt, könnte man die Informationen auch in der Datei speichern. Dafür bietet sich der informelle Standard ID3 an. Dieser Standard ist nicht Bestandteil des Standards für das MP3-Dateiformat, jedoch sehr verbreitet.

    Versionen

    Die Id-Tags liegen in verschiedenen Versionen vor, welche sich im Umfang unterscheiden. Es gibt die Versionen 1, 1.1, 2, 2.2, 2.3 und 2.4. Die Versionen bis 2.2 gelten als veraltet. Version 2.3 ist verbreitet, weshalb hier diese verwendet werden soll.

    ID3v2 Struktur

    10 ByteHeader
    xx ByteExtended Header (optional)
    xx ByteFrames

    Header

    ID3ID3v2 Identifier
    $03 00ID3v2 Version
    %abcd0000ID3v2 Flags
    4 * %0xxxxxxxID3v2 Size

    ID3v2 Identifier: Identifiziert einen IDv2-Tag.

    ID3v2 Version: Die erste Zahl gibt die Hauptversion, hier 3, und die zweite die Revision an.

    ID3v2 Flags: Die unteren vier Bit müssen den Wert "0" besitzen. Die anderen bedeuten:

    • a - Gibt an, ob die Unsynchronisation auf alle Frames anzuwenden ist.
    • b - Gibt an, ob dem Header ein erweiterter Header folgt.
    • c - Wird als Experimentalindikator verwendet.
    • d - Gibt an, ob ein Footer vorhanden ist. (Ab Version 2.4)

    ID3v2 Size: Die Länge der ID3v2 Struktur ohne Header und Footer. Sie wird als 32bit Synchsafe Integer angegeben.

    Extended Header

    4 * %0xxxxxxxExtended Header Size
    $01Anzahl der Flagbytes
    $xxExtended Flags

    Extended Header Size: Die Länge des gesamten erweiterten Headers, welcher nie kürzer als sechs Byte ist. Sie sind als 32bit Synchsafe Integer angegeben.

    Extended Flags: Sie sind mit %0bcd0000 definiert. Die Daten werden in der Reihenfolge der Flags angegeben. Jeder Datenbereich beginnt mit einem Byte im Wertebereich von $00 (0) bis $7F (128), welches die Länge des Bereiches angibt. Enthält ein Bereich keine Daten wird der Wert $00 als Längenangabe benutzt. Die Flags bedeuten:

    • b - Tag is an update: Gibt an, ob der Tag ein Update eines früheren Tags ist. Mit diesem Tag sind keine Daten verbunden. Die Längenangabe ist deshalb $00.
    • c - CRC data present: Gibt an, ob im Extended Header CRC-32 [ISO-3309] Daten enthalten sind. Der CRC wird von allen Daten zwischen dem Header und dem Footer abzüglich des Extended Header als Header-Tag-Längenfeld angegeben. Der CRC-32 wird als 35bit Synchsafe Integer angegeben. Die Längenangabe ist %05, der Frame 5 * %0xxxxxxx.
    • d - Tag restrictions: Gibt an, ob ein Tag in mehrfacher Hinsicht von der ID3v2-Spezifikation eingeschränkt wird. Die Datenlänge beträgt $01 und die Einschränkungen und ihre Bedeutungen sind:
    • %ppqrrstt

      • p - Tag Size Restrictions: Einschränkung der Taggröße
        00 - Nicht mehr als 128 Frames und 1 MB Taggröße.
        01 - Nicht mehr als 64 Frames und 128 KB Taggröße.
        10 - Nicht mehr als 32 Frames und 40 KB Taggröße.
        11 - Nicht mehr als 32 Frames und 4 KB Taggröße.
      • q - Text Encoding Restrictions: Einschränkung des Textencodings
        0 - Keine Einschränkungen.
        1 - Texte sind mit ISO-8859-1 oder UTF-8 encodet.
      • r - Text Fields Size Restrictions: Einschränkung der Textfeldgröße. Die Größe gibt die Anzahl aller Zeichen im Text an. Die Anzahl der Bytes ist abhängig von der Codierung.
        00 - Keine Einschränkungen
        01 - Kein Text ist länger als 1024 Zeichen.
        10 - Kein Text ist länger als 128 Zeichen.
        11 - Kein text ist länger als 30 Zeichen.
      • s - Image Encoding Restrictions: Einschränkung des Bildformates
        0 - Keine Einschränkungen.
        1 - Bilder nur als PNG oder JPEG.
      • t - Image Size Restrictions: Einschränkung der Bildgröße
        00 - Keine Einschränkungen
        01 - Alle Bilder sind nicht größer als 256 * 256 Pixel.
        10 - Alle Bilder sind nicht größer als 64 * 64 Pixel.
        11 - Alle Bilder sind genau 64 * 64 Pixel groß, soweit nicht anders erforderlich.

    In Version 2.3 sieht der Extended Header so aus:

    4 * %0xxxxxxxExtended Header Size
    $xx xxExtended Flags
    $xx xx xx xxSize of Padding

    Es gibt nur ein Extended Flags %x0000000 00000000, welches angibt, ob CRC-Daten vorhanden sind.

    Frames

    Ein Tag beinhaltet mindestens einen Frame, welcher mindestens ein Byte (ohne Header) groß ist. Eine festgelegte Reihenfolge für die Angabe der Frames gibt es nicht.

    Alle Frames enthalten einen Header sowie ein oder mehrere Felder mit den aktuellen Informationen. Der Header ist zehn Byte lang:

    Frame ID$xx xx xx xx (Vier Zeichen)
    Size4 * %0xxxxxxx
    Flags$xx xx

    Frame ID: Sie besteht aus den Großbuchstaben A bis Z und den Ziffern 0 bis 9. IDs, welche mit "X", "Y" oder "Z" beginnen sind für experimentelle Frames und können von jedem genutzt werden ohne dass das Experimentalflag (c) im Tag Header gesetzt werden muss.

    Size: Die Größe gibt die Datengröße des auf den Header folgenden Frames an. Die Angabe erfolgt als 32bit Synchsafe Integer

    Flags: Sie werden in zwei Bytes dargestellt und folgen dem Muster:

    %0abc0000 %0h00kmnp

    Das erste enthält Statusnachrichten und das zweite die Formatbeschreibung. Einige Formatflags geben an, dass das Frame zusätzliche Informationen enthält. Diese Informationen stehen zwischen dem Frameheader und den Framedaten in der gleichen Reihenfolge wie die Flags. Das bedeutet, der Größenangabe folgt das Byte mit der Verschlüsselungsmethode. Die Ergänzungen betreffem das Frame Size Feld, sind aber nicht Gegenstand der Verschlüsselung oder der Komprimierung.

    • a - Tag alter preservation: Wenn der Frame unbekannt ist soll er bei einer Änderung des Tags beibehalten (0) bzw. verworfen (1) werden.
    • b - File alter preservation: Wenn der Frame unbekannt ist soll er bei einer Änderung der Audiodaten beibehalten (0) bzw. verworfen (1) werden. Dies gilt nicht, wenn die Audiodaten vollständig ersetzt wurden.
    • c - Read only: Wenn dieses Flag gesetzt (1) ist, darf der Frameinhalt nur gelesen werden. Wird er dennoch verändert, muss das Flag zurückgesetzt (0) werden.
    • h - Grouping identity: Gibt an, ob der Frame einer Gruppe angehört (1) oder nicht (0). Wenn er einer Gruppe angehört, enthält er ein Byte mit der Group ID.
    • k - Compression: Gibt an, ob der Frameinhalt komprimiert ist (1) oder nicht (0). Die Komprimierung erfolgt mit der zlib deflate-Methode, wobei ein "Data Length Indicator" Byte einbezogen werden muss. Das bedeutet, im Falle einer Komprimierung ist auch das Flag 'p' gesetzt.
    • m - Encryption: Gibt an, ob der Frame verschlüsselt (1) ist oder nicht (0). Im Falle einer Verschlüsselung enthält der Frame ein Byte, welches die Methode angibt. Die Verschlüsselung erfolgt nach der Komprimierung. Der "Data Length Indicator" ist dann von der Verschlüsselungsmethode abhängig.
    • n - Unsynchronisation: Gibt an, ob auf den Frame die Methode Unsynchronisation angewandt wurde (1) oder nicht (0). Wurde sie angewandt ist ein "Data Length Indicator" wünschenswert jedoch nicht zwingend vorgeschrieben.
    • p - Data length indicator: Gibt an, ob der Frame einen "Data Length Indicator" enthält (1) oder nicht (0). Er hat den Wert eins wenn kein Frameformatflag gesetzt ist und wird als 32bit Synchsafe Integer angegeben.

    In Version 2.3 sind die Flags %abc00000 ijk0000. Die Entsprechungen der Flags sind: a = a, b = b, c = c, i = k, j = m und k = h.

    Voreinstellung für die Flags ist 0. Für die Frames AENC, ETCO, EQUA, MLLT, POSS, SYLT, SYTC, RVAD, TENC, TLEN und TSIZ ist das Flag b = 1.

    Zeichenketten

    Wenn nichts anderes angegeben ist, werden Zeichenketten, einschließlich numerischer und URLs, als ISO-8859-1 Zeichen im Bereich von $20 bis $FF dargestellt. Solche Zeichenketten werden in Framebeschreibungen als <text string> oder wenn Zeichenumbrüche erlaubt sind als <full text string> dargestellt. Wenn nichts anderes erwähnt wird, sind Zeilenumbrüche nicht erlaubt. Sind sie erlaubt, werden sie in der ISO-8859-1 nur mit $0A angegeben.

    Frames, welche verschiedene Typen der Textkodierung erlauben, enthalten ein Encoding Description Byte, also ein Byte mit der Kodierungsbeschreibung. Mögliche Kodierungen sind:

    • $00 - ISO-8859-1 [ISO-8859-1]. Abschluss mit $00.
    • $01 - UTF-16 [UTF-16] kodierter Unicode [UNICODE] mit BOM. Alle Zeichenketten im selben Frame haben die gleiche Byteorder. Abschluss mit $00 00.
    • $02 - UTF-16BE [UTF-16] kodierter Unicode [UNICODE] ohne BOM. Abschluss mit $00 00.
    • $03 - UTF-8 [UTF-8] kodierter Unicode [UNICODE]. Abschluss mit $00.

    Zeichenketten werden abhängig von der Kodierung in Framebeschreibungen als <text string according to encoding> oder wenn Zeilenumbrüche erlaubt sind als <full text string according to encoding> dargestellt. Alle leeren Zeichenketten vom Type $01, welche nullabgeschlossen sind besitzen einen Unicode BOM gefolgt von einer Unicode Null ($FF FE 00 00 oder $FE FF 00 00).

    Zeitangaben basieren auf einer Teilmenge der ISO 8601. Sie können sehr genau angegeben werden als "yyyy-MM-ddTHH:mm:ss" (year (Jahr), "-", month (Monat), "-", day (Tag), "T", hour (Stunde - 24), ":", minutes (Minuten), ":", seconds (Sekunden)), aber auch durch Entfernen von Indikatoren verkürzt werden. Gültige Zeitangaben sind yyyy, yyyy-MM, yyyy-MM-dd, yyyy-MM-ddTHH, yyyy-MM-ddTHH:mm und yyyy-MM-ddTHH:mm:ss. Alle Zeitangaben erfolgen in UTC. Für Zeitspannen wird das Slash-Zeichen verwendet. Für mehrere nicht zusammenhängende Daten werden mehrere Zeichenketten verwendet, wenn dies die Framedefinition zuläßt.

    Das Feld Language mit drei Byte Länge, welches in mehreren Frames verwendet wird, gibt die Sprache gemäß ISO-639-2 für den Frameinhalt an. Die Angabe sollte in Kleinbuchstaben erfolgen. Ist die Sprache nicht bekannt sollte die Zeichenfolge "xxx" verwendet werden.

    Alle URL werden relativ angegeben.

    Speicherort

    Tags werden den Audiodaten bis Version 2.3 der Audiodatei vorangestellt.

    Synchsafe Integer

    In einigen Teilen des Tags ist es unpraktisch, das Unsychronisation Schema anzuverwenden. Besonders problematisch sind dabei Größenangaben. Die Lösung ist die Verwendung von ID3v2 Synchsafe Integer. Synchsafe Integer sind ganze Zahlen, deren höchstes Bit (Bit 7) immer den Wert Null behält, so dass nur sieben von acht Bits zur Verfügung stehen. Ein 32-Bit Synchsafe Integer enthält so 28 Bit Informationen.

    Beispiel:

    255 (%11111111) hat als 16bit Synchsafe Integer den Wert 383 (%00000001 01111111).

    Auswahl der Frames

    Bei der Abfrage der Eigenschaften wurden im Beispiel folgende Informationen ermittelt:

    • FreeDB
      • FreeDB DiscID
      • Album Titel (Interpret/Titel)
      • Erscheinungsjahr
      • Kategorie
      • Genre
      • Tracktitel
    • MusicBrainz
      • MusicBrainz DiscIB (MBID)
      • Album Titel
      • Album Künstler
      • Erscheinungsdatum
      • Track Titel
      • Track Künstler
      • Album Cover
      • opt: EAN (nicht immer)
      • opt: ASIN
      • opt: Release ID
      • opt: Artist ID

    Man kann natürlich noch weitere Informationen aus der MusicBrainz-XML-Datei extrahieren.

    Für Zuordnung für der ermittelten Eigenschaften zu dem Frames stellt MusicBrainz eine Mapping Tabelle zur Verfügung.

    Name MusicBrainz Name ID3v2 Frame
    MusicBrainz Disc Id MusicBrainz Disc Id TXXX:MusicBrainz Disc Id
    CD Titel Release Title TALB
    MusicBrainz Release ID MusicBrainz Release ID TXXX:MusicBrainz Album Id
    CD Künstler Release Artist TPE2
    MusicBrainz Künstler ID MusicBrainz Artist ID TXXX:MusicBrainz Artist Id
    Erscheinungsdatum Release Date TYER + TDAT
    Tracknummer / Trackanzahl Track Number / Total Tracks TRCK
    Track Titel Track Title TIT2
    Track Künstler Artist TPE1
    EAN Barcode TXXX:BARCODE
    ASIN ASIN TXXX:ASIN

    Für FreeDB kämen hinzu:

    Name ID3v2 Frame
    FreeDB Disc Id TXXX:FreeDB Disc Id
    Kategorie TCON
    Genre TCON

    Die Framebezeichnungen beginnen alle mit "T", das bedeutet, es sind Text Informations Frames.

    Text Informations Frames

    Die Textinformationsframes sind die wichtigsten Frames, sie enthalten Informationen wie Interpret, Album usw. Alle IDs beginnen mit "T". Die Frames haben das Format:

    <Header for 'Text information frame', ID: "T000" - "TZZZ" ausser "TXXX">
    Text encoding $00
    Information <text string according to encoding>
    

    Zum Beispiel:

    TALB
    Album/Movie/Show - Titel der Aufnahme
    TCON
    Content type - Der Inhaltstyp als numerische Zeichenkette. Kann mehrere Genres, welche in Klammern - "(", ")" - gesetzt sind enthalten. Verfeinerungen können mit doppelten Klammern - "((", "))" - angegeben werden. Ausserdem gibt es die Typen RX - Remix und CR - Cover
    TDAT
    Date - Das Datum besteht aus einer numerischen Zeichenkette im Format DDMM mit dem Datum der Aufnahme und ist vier Zeichen lang.
    TIME
    Time - Die Zeit besteht aus einer numerischen Zeichenkette im Format HHMM mit der Zeit der Aufnahme und ist vier Zeichen lang.
    TIT2
    Title/songname/content description - Der Name des Stückes (z.B. "Adagio").
    TPE1
    Lead performer(s)/Soloist(s) - Der Künstler, der Interpret, der Solist oder die Gruppe werden als Hauptkünstler verwendet. Sie werden durch "/" getrennt.
    TPE2
    Band/orchestra/accompaniment - Die Band, das Orchester oder die Begleitung als zusätzliche Information über die Interpreten der Aufnahme.
    TRCK
    Track number/Position in set - Die numerische Zeichenkette enthält die Ordnungsnummer der Audiodatei in der Originalaufnahme. Diese kann durch Hinzufügen des Trennzeichens "/" mit der Gesamtanzahl der Tracks der Originalaufnahme erweitert werden. Z.B. "4/9".
    TYER
    Year - Enthält als numerischer Zeichenkette das Jahr der Aufnahme. Der Frame ist immer vier Byte lang.

    User Defined Text Information Frame (ab v2.3)

    Der Frame enthält eine Beschreibung der Zeichenkette sowie die Zeichenkette. Der Tag kann mehrere Frames enthalten, jedoch nicht mit dem selben Inhalt. Das Format:

    <Header for 'User defined text information frame', ID: "TXXX">
    Text encoding $xx
    Description <text string according to encoding> $00 (00)
    Value <text string according to encoding>
    

    Interessant wären zum Beispiel:

    TENC
    Encoded by - Der Frame enthält den Namen der Person oder der Organisation, welche die Audiodatei kodiert hat. Das Feld kann eine Copyright-Meldung enthalten, wenn die Audiodatei durch den Encoder geschützt wird.
    TFLT
    File type - Der Frame gibt den Type der Audiodatei an:
    • MPG - MPEG Audio
      • /1 - MPEG 1/2 Layer I
      • /2 - MPEG 1/2 Layer II
      • /3 - MPEG 1/2 Layer III
      • /2.5 - MPEG 2.5
      • /AAC - Advanced Audio Compression
    • VQF - Transform-domain Weighted Interleave Vector Quantization
    • PCM - Pulse Code Modulated audio
    Er kann auch für andere Typen genutzt werden. Die Verwendung erfolgt in ähnlicher Weise wie im Frame TMED, jedoch ohne Klammern. Ist der Frame nicht vorhanden, wird der Type MPG angenommen.
    TLAN
    Language(s) - Der Sprachenframe sollte die Sprache des Textes bzw. der Texte angeben, in welche gesprochen oder gesungen wird. Die Darstellung erfolgt mit drei Zeichen nach ISO-639-2. Werden mehrere Sprachen verwendet, sollte eine Angabe entsprechend der Nutzung erfolgen.
    TLEN
    Length - Der Frame enthält die Spieldauer der Datei in Millisekunden und wird als numerische Zeichenfolge dargestellt.
    TMED
    Media type - Der Mediatyp gibt an, woraus die Audiodatei entstand. Dies kann ein Text oder ein Verweis entsprechend vordefinierter Medientypen sein. Referenzen werden in Klammern - "(" und ")" - gesetzt und können mit einer Verfeinerung ergänzt werden, z.B. (MC) mit vier Kanälen. Beginnt ein Text mit einer Verfeinerung sollte diese in eine doppelte Klammer - "((" und "))" - gesetzt werden. Vordefinierte Verfeinerungen werden dem Medientyp angehängt, z.B. (CD / A).
    • CD - Compact Disc
      • /A Analoge Übertragung vom Medium
      • /DD - DDD
      • /AD - ADD
      • /AA - AAD
    • ...

    Attached picture

    Dieser Frame enthält ein Bild welches im Zusammenhang mit dem Song steht. Das Bildformat ist der MIME- und der Picturetype des Bildes. Wenn Interoperabilität gewünscht wird, sollte das Bildformat "image/png" oder "image/jpeg" verwendet werden. Die Beschreibung ist eine kurze Beschreibung des Bildes, sie darf 64 Zeichen lang sein, kann aber auch leer sein. Es können mehrere Bilder, jeweils in einem eigenen Frame, angehängt werden. Jedoch nur jeweils eines mit der gleichen Inhaltsbeschreibung. Es besteht die Möglichkeit, einen Link zu der Bilddatei mit dem MIME-Typ "->" zu setzen und eine vollständige URL anstelle von Bilddaten einzutragen. Die Verwendung von verknüpften Dateien sollte jedoch sparsam verwendet werden, da das Risiko einer Trennung der Dateien besteht.

    <Header for 'Attached picture', ID: "APIC">
    Text encoding   $xx
    MIME type       <text string> $00
    Picture type    $xx
    Description     <text string according to encoding> $00 (00)
    Picture data    <binary data>
    

    Picturetypen:

    • $00 - Anderer
    • $01 - 32x32 Pixel Dateiicon (nur PNG)
    • $02 - Andere Dateiicon
    • $03 - Cover (Front)
    • $04 - Cover (Back)
    • $05 - Merkblatt
    • $06 - Medium (z.B. Labelseite der CD)
    • $07 - Liedkünstler/Interpret/Solist
    • $08 - Künstler/Darsteller
    • $09 - Dirigent
    • $0A - Band/Orchester
    • $0B - Komponist
    • $0C - Texter/Dichter
    • $0D - Aufnahmeort
    • $0E - Bei der Aufnahme
    • $0F - Bei der Aufführung
    • $10 - Film-/Videoszenenbild
    • $11 - A bright coloured fish
    • $12 - Illustration
    • $13 - Band-/Künstelerlogo
    • $14 - Herausgeber-/Studiologo