ID3v1

ID3v1 Sturcture

ID3v1 is a 128-byte metadata container primarily used with MP3 files to store basic catalog information. This initial release can store the artist name, song title, album title, release year, user comment, and genre. ID3v1 is identified by the 3-byte magic number 0x54 0x41 0x47 or in ASCII, TAG, and is located at 128 bytes from the end of an MP3. Following the identifier are the following fields in order song title, artist, album, year, comment, and genere.

ID3v1 is made up of 5 text frames with the Latin1 (ISO-8859-1) character set and 1 integer field. The text fields consist of 4 30-byte fields which are title, artist, album, and comment, and 1 4-byte field consisting of the year. All text fields are followed by a single genre byte with all compatible genres listed here.

ID3v1.1 Structure

ID3v1.1 follows the exact same structure as the previous version except the comment field is shortened to make room for an extra integer. In this version, the comment field is truncated by 2 bytes making its capacity now 28 bytes. The first byte (ex 29th byte) is used to store a null character to indicate that the following byte contains a track number.

ID3v2

ID3v2 Sturcture

ID3v2 is a variable byte metadata container primarily used with MP3 files to store complex information along with audio settings in a structured way. Version 2 is completely different when compared to its first iteration and usually starts at the beginning of an MP3 file. As of October 2023, there are 3 drafted versions of ID3v2 these being: ID3v2.2, ID3v2.3, and ID3v2.4 where each adds new or discards features.

The first draft of Id3v2 is known as Id3v2.2 and lays the groundwork for future ID3v2 version's base structure. This version features a 10-byte header followed by a frame section composed of n frames. Each frame contains different data about the MP3 file such as song title, album title, and disc number. ID3v2.3 expands upon the structure of the container by adding an optional extended header and more supported frames. The purpose of the extended header in this version, however, is quite limited but can add more context to the audio file or extra metadata features. The final version is ID3v2.4, this version adds a padding section and footer which are both optional along with replacing frames with new drafts. Each version uses different character sets ID3v2.2 only supports Latin 1(ISO-8859-1) and UTF-16le, ID3v2.3 supports Latin 1(ISO-8859-1), UTF-16le, and UTF16be, and finally, ID3v2.4 supports all before mentioned encodings plus UTF8.

ID3v2.2 Header

ID3v2.4 is identified by version $02 and contains two different flags located within a headers 6th byte with all other undifined bits not set. Below are the definitions for them within this draft:

a - Unsynchronisation

Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is used (see unsynchronisation in the side bar); a set bit indicates usage.

b - Compression

The second bit (bit 6) is indicating whether or not compression is used; a set bit indicates usage. Since no compression scheme has been decided in this draft, the ID3 decoder should just ignore the entire tag if the compression bit is set.

The ID3v2.2 tag size is the size of the complete tag after unsychronisation, including padding, excluding the header (total tag size - 10). The reason to use 28 bits (representing up to 256MB) for size description is that we don't want to run out of space here.

ID3v2.3 Header

ID3v2.3 is identified by version $03 and contains three different flags located within a headers 6th byte with all other undifined bits not set. Below are the definitions for them within this draft:

a - Unsynchronisation

Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is used (see unsynchronisation in the side bar); a set bit indicates usage.

b - Extended header

The second bit (bit 6) indicates whether or not the header is followed by an extended header.

c - Experimental indicator

The third bit (bit 5) should be used as an 'experimental indicator'. This flag should always be set when the tag is in an experimental stage.

The ID3v2.3 tag size is the size of the complete tag after unsychronisation, including padding, excluding the header but not excluding the extended header (total tag size - 10). Only 28 bits (representing up to 256MB) are used in the size description to avoid the introducuction of 'false syncsignals'.

ID3v2.4 Header

ID3v2.4 is identified by version $04 and contains four different flags located within a headers 6th byte with all other undifined bits not set. Below are the definitions for them within this draft:

a - Unsynchronisation

Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is used (see unsynchronisation in the side bar); a set bit indicates usage.

b - Extended header

The second bit (bit 6) indicates whether or not the header is followed by an extended header.

c - Experimental indicator

The third bit (bit 5) should be used as an 'experimental indicator'. This flag should always be set when the tag is in an experimental stage.

d - Footer

The fourth bit (bit 4) indicates that a footer is present at the very end of the tag. A set bit indicates the presence of a footer.

The ID3v2 tag size is the sum of the byte length of the extended header, the padding and the frames after unsynchronisation. If a footer is present this equals to ('total size' - 20) bytes, otherwise ('total size' - 10) bytes.

ID3v2 Extended Header

The extended header contains information that can provide further insight in the structure of the tag, but is not vital to the correct parsing of the tag information; hence the extended header is optional.

ID3v2.3 Extended Header

The 'Extended header size' is 6 or 10 bytes, excluding itself. The 'Size of padding' is simply the total tag size excluding the frames and the headers, in other words the padding. The extended header is considered separate from the header proper, and as such is subject to unsynchronisation.

The extended flags are a secondary flag set which describes further attributes of the tag. These attributes are currently defined as follows:

%x0000000 00000000

x - CRC data present

If this flag is set four bytes of CRC-32 data ($xx xx xx xx) is appended to the extended header. The CRC should be calculated before unsynchronisation on the data between the extended header and the padding, i.e. the frames and only the frames.

ID3v2.4 Extended Header

Where the 'Extended header size' is the size of the whole extended header, stored as a 32 bit synchsafe integer. An extended header can thus never have a size of fewer than six bytes. The extended flags field, with its size described by 'Number of flags', is defined as:

%0bcd0000

Each flag that is set in the extended header has data attached, which comes in the order in which the flags are encountered (i.e. the data for flag 'b' comes before the data for flag 'c'). Unset flags cannot have any attached data. All unknown flags must be unset and their corresponding data removed when a tag is modified. Every set flag's data starts with a length byte, which contains a value between 0 and 128 ($00 - $7f), followed by data that has the field length indicated by the length byte. If a flag has no attached data, the value $00 is used as length byte.

b - Tag is an update

If this flag is set, the present tag is an update of a tag found earlier in the present file or stream. If frames defined as unique are found in the present tag, they are to override any corresponding ones found in the earlier tag. This flag has no corresponding data and thus does not increase the 'Number of flag'.

c - CRC data present

If this flag is set, a CRC-32 [ISO-3309] data is included in the extended header. The CRC is calculated on all the data between the header and footer as indicated by the header's tag length field, minus the extended header. Note that this includes the padding (if there is any), but excludes the footer. The CRC-32 is stored as an 35 bit synchsafe integer, leaving the upper four bits always zeroed.

Number of flag bytes is increased by 5.

Total frame CRC format : 5 * %0xxxxxxx

d - Tag restrictions

For some applications it might be desired to restrict a tag in more ways than imposed by the ID3v2 specification. Note that the presence of these restrictions does not affect how the tag is decoded, merely how it was restricted before encoding. If this flag is set the tag is restricted as follows:

Number of flag bytes is increased by 1.

Restrictions format : %ppqrrstt

p - Tag size restrictions

$00 = No more than 128 frames and 1 MB total tag size.

$01 = No more than 64 frames and 128 KB total tag size.

$10 = No more than 32 frames and 40 KB total tag size.

$11 = No more than 32 frames and 4 KB total tag size.

q - Text encoding restrictions

0 = No restrictions.

1 = Strings are only encoded with ISO-8859-1 or UTF-8.

r - Text fields size restrictions

$00 = No restrictions.

$01 = No string is longer than 1024 characters.

$10 = No string is longer than 128 characters.

$11 = No string is longer than 30 characters.

s - Image encoding restrictions

0 = No restrictions.

1 = Images are encoded only with PNG or JPEG.

t - Image size restrictions

$00 = No restrictions.

$01 = All images are 256x256 pixels or smaller.

$10 = All images are 64x64 pixels or smaller.

$11 = All images are exactly 64x64 pixels, unless required otherwise.

ID3v2 Frame Structure

All ID3v2 frames consists of one frame header followed by one or more fields containing the actual information.

The frame ID is made out of the characters capital A-Z and 0-9. Identifiers beginning with "X", "Y" and "Z" are for experimental frames and free for everyone to use, without the need to set the experimental bit in the tag header. Bear in mind that someone else might have used the same identifier as you. All other identifiers are either used or reserved for future use.

The frame ID is followed by a size descriptor containing the size of the data in the final frame, after encryption, compression and unsynchronisation. The size is excluding the frame headers total size.

There is no fixed order of the frames' appearance in the tag, although it is desired that the frames are arranged in order of significance concerning the recognition of the file. Each tag will contain a minimum of one frame with a minimum of one byte in its content.

Strings, including numeric strings and URLs, are represented in Latin1 (ISO-8859-1) characters in the range $20 - $FF. If nothing else is said the newline character is forbidden. In Latin1 a newline is represented with '\n'($0A) only.

Strings dependent on an encoding must be within a frame with a pesent encoding byte. These encodings are UTF-8, UTF-16le, UTF-16be, and ISO-8859-1 which also will have '\n'($0A) forbidden unless otherwise stated. Any empty UTF-16 string must have a Byte Order Mark (BOM) prepended followed by NULL ($FF FE 00 00 or $FE FF 00 00). This rule regarding empty strings does not apply to ISO-8859-1 and UTF-8 encodings. These encodings must have a NULL ($00) character when empty. Bellow are defined encodings and their definitions per version:

Encodings
ID3v2.2
ID3v2.3
ID3v2.4
ISO-8859-1

Encoded as : $00

Encoded as : $00

Encoded as : $00

UTF-16le

Encoded as : $01

Encoded as : $01

Encoded as : $01

UTF-16be

Encoded as : $01

Encoded as : $01

Encoded as : $02

UTF-8

Encoded as : $03

Many frames include a language identifier to tell the user the language of the frame. These identifiers are three byte language codes acording to ISO-639-2 and will be manditory in supported frames.

ID3v2.2 Header

Compared to other versions of this metadata container ID3v2.2 contains the simplest frame header. A frame header in this version contains a 3-byte frame ID followed by a 3-byte frame size is represented as a 24-bit integer. The frame size notably only represents the number of bytes present in the frames content and excludes the total header bytes.

ID3v2.3 Header

ID3v2.3 Headers contain a 4-byte identifier followed by a 4-byte frame size and finally, a 2-byte flag section. this makes the total header size 10-bytes the size is calculated as frame size excluding frame header (frame size - 10).

In the frame header the size descriptor is followed by two flags bytes. All unused flags must be cleared. The first byte is for 'status messages' and the second byte is for encoding purposes. If an unknown flag is set in the first byte the frame may not be changed without the bit cleared. If an unknown flag is set in the second byte it is likely to not be readable. The flags field is defined as follows:

%abc00000 %ijk00000

a - Tag alter preservation

This flag tells the software what to do with this frame if it is unknown and the tag is altered in any way. This applies to all kinds of alterations, including adding more padding and reordering the frames.

0 = Frame should be preserved.

1 = Frame should be discarded.

b - File alter preservation

This flag tells the software what to do with this frame if it is unknown and the file, excluding the tag, is altered. This does not apply when the audio is completely replaced with other audio data.

0 = Frame should be preserved.

1 = Frame should be discarded.

c - Read only

This flag, if set, tells the software that the contents of this frame is intended to be read only. Changing the contents might break something, e.g. a signature. If the contents are changed, without knowledge in why the frame was flagged read only and without taking the proper means to compensate, e.g. recalculating the signature, the bit should be cleared.

i - Compression

This flag indicates whether or not the frame is compressed.

0 = Frame is not compressed.

1 = Frame is compressed using zlib with 4 bytes for 'decompressed size' appended to the frame header.

j - Encryption

This flag indicates wether or not the frame is enrypted. If set one byte indicating with which method it was encrypted will be appended to the frame header. Check out the encryption method registration frame for more information about encryption method registration.

0 = Frame is not encrypted.

1 = Frame is encrypted.

k - Grouping identity

This flag indicates whether or not this frame belongs in a group with other frames. If set a group identifier byte is added to the frame header. Every frame with the same group identifier belongs to the same group.

0 = Frame does not contain group information.

1 = Frame contains group information.

Some flags indicates that the frame header is extended with additional information. This information will be added to the frame header in the same order as the flags indicating the additions. I.e. the four bytes of decompressed size will preceed the encryption method byte. These additions to the frame header, while not included in the frame header size but are included in the 'frame size' field, are not subject to encryption or compression. However, by default all flags should not be set such that the section equates to $00 00.

ID3v2.4 Header

ID3v2.4 Headers contain a 4-byte identifier followed by a 4-byte frame size and finally, a 2-byte flag section. this makes the total header size 10-bytes the size is calculated as frame size excluding frame header (frame size - 10).

In the frame header the size descriptor is followed by two flag bytes. All unused flags must be cleared. The first byte is for 'status messages' and the second byte is a format description. If an unknown flag is set in the first byte the frame must not be changed without that bit cleared. If an unknown flag is set in the second byte the frame is likely to not be readable. Some flags in the second byte indicates that extra information is added to the header. These fields of extra information is ordered as the flags that indicates them. The flags field is defined as follows (l and o left out because ther resemblence to one and zero):

%0abc0000 %0h00kmnp

Some frame format flags indicate that additional information fields are added to the frame. This information is added after the frame header and before the frame data in the same order as the flags that indicates them. I.e. the four bytes of decompressed size will precede the encryption method byte. These additions affects the 'frame size' field, but are not subject to encryption or compression. The default status flags setting for a frame is, unless stated otherwise, 'preserved if tag is altered' and 'preserved if file is altered', i.e. %00000000. The flags field is defined as follows:

a - Tag alter preservation

This flag tells the software what to do with this frame if it is unknown and the tag is altered in any way. This applies to all kinds of alterations, including adding more padding and reordering the frames.

0 = Frame should be preserved.

1 = Frame should be discarded.

b - File alter preservation

This flag tells the tag parser what to do with this frame if it is unknown and the file, excluding the tag, is altered. This does not apply when the audio is completely replaced with other audio data.

0 = Frame should be preserved.

1 = Frame should be discarded.

c - Read only

This flag, if set, tells the software that the contents of this frame are intended to be read only. Changing the contents might break something, e.g. a signature. If the contents are changed, without knowledge of why the frame was flagged read only and without taking the proper means to compensate, e.g. recalculating the signature, the bit must be cleared.

h - Grouping identity

This flag indicates whether or not this frame belongs in a group with other frames. If set, a group identifier byte is added to the frame. Every frame with the same group identifier belongs to the same group.

0 = Frame does not contain group information.

1 = Frame contains group information.

k - Compression

This flag indicates whether or not the frame is compressed. A 'Data Length Indicator' byte must be included in the frame.

0 = Frame is not compressed.

1 = Frame is compressed using zlib deflate method. If set, this requires the 'Data Length Indicator' bit to be set as well.

m - Encryption

This flag indicates whether or not the frame is encrypted. If set, one byte indicating with which method it was encrypted will be added to the frame. See description of the ENCR frame for more information about encryption method registration. Encryption should be done after compression. Whether or not setting this flag requires the presence of a 'Data Length Indicator' depends on the specific algorithm used.

0 = Frame is not encrypted.

1 = Frame is encrypted.

n - Unsynchronisation

This flag indicates whether or not unsynchronisation was applied to this frame. See section 6 for details on unsynchronisation. If this flag is set all data from the end of this header to the end of this frame has been unsynchronised. Although desirable, the presence of a 'Data Length Indicator' is not made mandatory by unsynchronisation.

0 = Frame has not been unsynchronised.

1 = Frame has been unsyrchronised.

p - Data length indicator

This flag indicates that a data length indicator has been added to the frame. The data length indicator is the value one would write as the 'Frame length' if all of the frame format flags were zeroed, represented as a 32 bit synchsafe integer.

0 = There is no Data Length Indicator.

1 = A data length Indicator has been added to the frame.

ID3v2 Frames

Album Sort Order

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TSOA

ID3v2.4

The 'Album sort order' frame defines a string which should be used instead of the album name (TALB) for sorting purposes. E.g. an album named "A Soundtrack" might preferably be sorted as "Soundtrack".

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TSOA
  Frame Size = $00 00 00 17
  Frame Flags = $00 00
  Encoding = $02
  Information = "Soundtrack"
Bytes:
4
4
2
1
22

Album/Movie/Show Title

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TAL

ID3v2.2

TALB

ID3v2.3

TALB

ID3v2.4

The 'Album/Movie/Show title' frame is intended for the title of the recording (or source of sound) from which the audio in the file is taken.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TAL
  Frame Size = $00 00 0B
  Encoding = $00
  Information = "Family Guy"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TALB
  Frame Size = $00 00 00 0B
  Frame Flags = $00 00
  Encoding = $00
  Information = "Family Guy"
Bytes:
3
3
1
10

4
4
2
1
10

Attached Picture

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
PIC

ID3v2.2

APIC

ID3v2.3

APIC

ID3v2.4

This frame contains a picture directly related to the audio file however, This frame is defined differently in different versions.

In ID3v2.2, Image format is preferably "PNG" or "JPG". Description is a short description of the picture, represented as a terminated textstring. The description has a maximum length of 64 characters, but may be empty. There may be several pictures attached to one file, each in their individual "PIC" frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type $01 and $02 respectively. There is a possibility to put only a link to the image file by using the 'image format' "-->" and having a complete URL instead of picture data. The use of linked files should however be used restrictively since there is the risk of separation of files.

The format for this frame is as follows:

Encoding = $xx
Image Format = $xx xx xx
Picture type = $xx
Description = [n bytes of encoded data] $00 (00)
Picture data = [n bytes of binary data]

In ID3v2.3 and ID3v2.4, Image format is the MIME type and subtype for the image. In the event that the MIME media type name is omitted, "image/" will be implied. The "image/png" (PNG) or "image/jpeg" (JFIF) picture format should be used when interoperability is wanted. Description is a short description of the picture, represented as a terminated text string. There may be several pictures attached to one file, in their individual "APIC" frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type $01 and $02 respectively. There is the possibility to put only a link to the image file by using the 'MIME type' "-->" and having a complete URL [URL] instead of picture data. The use of linked files should however be used sparingly since there is the risk of separation of files.

The format for this frame is as follows:

Encoding = $xx
MIME Type = [ISO-8859-1 encoded string] $00
Picture type = $xx
Description = [n bytes of encoded data] $00 (00)
Picture data = [n bytes of binary data]

Defined Picture types:

$00 = Other
$01 = 32x32 pixels 'file icon' (PNG only)
$02 = Other file icon
$03 = Cover (front)
$04 = Cover (back)
$05 = Leaflet page
$06 = Media (e.g. label side of CD)
$07 = Lead artist/lead performer/soloist
$08 = Artist/performer
$09 = Conductor
$0A = Band/Orchestra
$0B = Composer
$0C = Lyricist/text writer
$0D = Recording Location
$0E = During recording
$0F = During performance
$10 = Movie/video screen capture
$11 = A bright coloured fish
$12 = Illustration
$13 = Band/artist logotype
$14 = Publisher/Studio logotype

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = PIC
  Frame Size = $05 7E 5C
  Encoding = $01
  Picture Type = $03
  Description = "Album Cover" $00 00
  Picture Data = ...
ID3v2.3 & ID3v2.4 Example:
  Frame ID = APIC
  Frame Size = $00 15 7C 67
  Frame Flags = $00 00
  Encoding = $01
  MIME Type = "image/jpeg" $00
  Picture Type = $03
  Description = "Album Cover" $00 00
  Picture Data = ...
Bytes:
3
3
1
1
26
360000

4
4
2
1
11
1
26
360000

Audio Encryption

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
CRA

ID3v2.2

AENC

ID3v2.3

AENC

ID3v2.4

This frame indicates if the actual audio stream is encrypted, and by whom. Since standardisation of such encryption scheme is beyond this document, all audio encryption frames begin with a terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encrypted audio file. Questions regarding the encrypted audio should be sent to the email address specified. If a $00 is found directly after the 'Frame size' and the audio file indeed is encrypted, the whole file may be considered useless.

After the 'Owner identifier', a two byte integer represented as seconds to an unencrypted part of the audio can be specified. The 'Preview start' and 'Preview length' is described in frames. If no part is unencrypted, these fields should be left zeroed. After the 'preview length' field follows optionally a data block required for decryption of the audio. There may be more than one audio encryption frames in a tag, but only one with the same 'Owner identifier'.

The format for this frame is as follows:

Owner identifier = [ISO-8859-1 encoded string] $00
Priview start = $xx xx
Priview length = $xx xx
Encryption info = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = CRA
  Frame Size = $00 00 19
  Owner identifier = "example@example.com" $00
  Preview start = $00 0A
  Preview length = $00 14
  Encryption info = $00
ID3v2.3 & ID3v2.4 Example:
  Frame ID = AENC
  Frame Size = $00 00 00 22
  Frame Flags = $00 00
  Owner identifier = "example@example.com" $00
  Preview start = $00 14
  Preview length = $00 3C
  Encryption info = $3F 8D 9A 0B 1C 2D 3E 4F 50 61
Bytes:
3
3
20
2
2
1

4
4
2
20
2
2
10

BPM (Beats Per Minute)

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TBP

ID3v2.2

TBPM

ID3v2.3

TBPM

ID3v2.4

The 'BPM' frame contains the number of beats per minute in the main part of the audio. The BPM is an integer and represented as a numerical string.

The frames format is as follows:

Encoding = $xx
Information = Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TBP
  Frame Size = $00 00 04
  Encoding = $00
  Information = "120"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TBPM
  Frame Size = $00 00 00 04
  Frame Flags = $00 00
  Encoding = $00
  Information = "120"
Bytes:
3
3
1
3

4
4
2
1
3

Band/Orchestra/Accompaniment

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TP2

ID3v2.2

TPE2

ID3v2.3

TPE2

ID3v2.4

The 'Band/Orchestra/Accompaniment' frame is used for additional information about the performers in the recording.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TP2
  Frame Size = $00 00 0C
  Encoding = $00
  Information = "Arcade Fire"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TPE2
  Frame Size = $00 00 00 04
  Frame Flags = $00 0C
  Encoding = $00
  Information = "Arcade Fire"
Bytes:
3
3
1
11

4
4
2
1
11

Comments

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
COM

ID3v2.2

COMM

ID3v2.3

COMM

ID3v2.4

This frame is intended for any kind of full text information that does not fit in any other frame. It consists of a frame header followed by encoding, ISO-639-2 language and content descriptors and is ended with the actual comment as a text string. Newline characters are allowed in the comment text string. There may be more than one comment frame in each tag, but only one with the same language and content description.

The frames format is as follows:

Encoding = $xx
Language = [ISO-639-2 language code]
Short content description = [n bytes of encoded data] $00 (00)
The actual text = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = COM
  Frame Size = $00 00 1D
  Encoding = $00
  Language = eng
  Short content description = "banger"
  The actual text = "the beat goes hard"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = COMM
  Frame Size = $00 00 00 24
  Frame Flags = $00 00
  Encoding = $02
  Language = jpn
  Short content description = "バンガー"
  The actual text = "リフはハードになる"
Bytes:
3
3
1
3
7
18

4
4
2
1
3
12
20

Commercial Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

COMR

ID3v2.3

COMR

ID3v2.4

This frame enables several competing offers in the same tag by bundling all needed information. That makes this frame rather complex but it's an easier solution than if one tries to achieve the same result with several frames. The frame begins, after the frame ID, size and encoding fields, with a price string field. A price is constructed by one three character currency code, encoded according to ISO-4217 alphabetic currency code, followed by a numerical value where "." is used as decimal separator. In the price string several prices may be concatenated, separated by a "/" character, but there may only be one currency of each type.

The price string is followed by an 8 character date string in the format YYYYMMDD, describing for how long the price is valid. After that is a contact URL, with which the user can contact the seller, followed by a one byte 'received as' field. It describes how the audio is delivered when bought according to the following list:

$00 = Other
$01 = Standard CD album with other songs
$02 = Compressed audio on CD
$03 = File over the Internet
$04 = Stream over the Internet
$05 = As note sheets
$06 = As note sheets in a book with other sheets
$07 = Music on other media
$08 = Non-musical merchandise

Next follows a terminated string with the name of the seller followed by a terminated string with a short description of the product. The last thing is the ability to include a company logotype. The first of them is the 'Picture MIME type' field containing information about which picture format is used. In the event that the MIME media type name is omitted, "image/" will be implied. Currently only "image/png" and "image/jpeg" are allowed. This format string is followed by the binary picture data. This two last fields may be omitted if no picture is attached. There may be more than one 'commercial frame' in a tag, but no two may be identical.

The frames format is as follows:

Encoding = $xx
Price string = [ISO-8859-1 encoded string] $00
Valid until = [ISO-8859-1 encoded string]
Contact URL = [ISO-8859-1 encoded string] $00
Received as = $xx
Name of seller = [n bytes of encoded data] $00 (00)
Description = [n bytes of encoded data] $00 (00)
Picture MIME type = [ISO-8859-1 encoded string] $00
Seller logo = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = COMR
  Frame Size = $00 00 08 48
  Frame Flags = $10 00
  Encoding = $03
  Price string = "0.99" $00
  Valid until = "20050514"
  Contact URL = "https://www.apple.com" $00
  Received as = $01
  Name of seller = "itunes" $00
  Description = "from apples store" $00
  Picture MIME type = "image/png"
  Seller logo = ....
Bytes:
4
4
2
1
5
8
22
1
7
18
10
1024

Commercial Information

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WCM

ID3v2.2

WCOM

ID3v2.3

WCOM

ID3v2.4

The 'Commercial information' frame is a URL pointing at a webpage with information such as where the album can be bought. There may be more than one "WCOM" frame in a tag, but not with the same content.

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WCM
  Frame Size = $00 00 23
  URL = "https://pointnever.com/"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WCOM
  Frame Size = $00 00 00 23
  Frame Flags = $00 00
  URL = "https://pointnever.com/"
Bytes:
3
3
32

4
4
2
23

Composer

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TCM

ID3v2.2

TCOM

ID3v2.3

TCOM

ID3v2.4

The 'Composer(s)' frame is intended for the name of the composer(s). They are seperated with the "/" character.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TCM
  Frame Size = $00 00 0F
  Encoding = $00
  Information = "Daniel Lopatin"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TCOM
  Frame Size = $00 00 00 1C
  Frame Flags = $00 00
  Encoding = $00
  Information = "Daniel Lopatin/Abel Tesfaye"
Bytes:
3
3
1
14

4
4
2
1
27

Conductor/Performer Refinement

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TP3

ID3v2.2

TPE3

ID3v2.3

TPE3

ID3v2.4

The 'Conductor' frame is used for the name of the conductor.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TP3
  Frame Size = $00 00 15
  Encoding = $00
  Information = "Ludwig van Beethoven"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TPE3
  Frame Size = $00 00 00 15
  Frame Flags = $00 00
  Encoding = $00
  Information = "Ludwig van Beethoven"
Bytes:
3
3
1
20

4
4
2
1
20

Content Group Description

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TT1

ID3v2.2

TIT1

ID3v2.3

TIT1

ID3v2.4

The 'Content group description' frame is used if the sound belongs to a larger category of sounds/music. For example, classical music is often sorted in different musical sections (e.g. "Piano Concerto", "Weather - Hurricane").

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TT1
  Frame Size = $00 00 15
  Encoding = $00
  Information = "Piano Concerto"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TIT1
  Frame Size = $00 00 00 29
  Frame Flags = $00 00
  Encoding = $01
  Information = "Weather - Hurricane"
Bytes:
3
3
1
14

4
4
2
1
40

Content Type

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TCO

ID3v2.2

TCON

ID3v2.3

TCON

ID3v2.4

The content type frame is a tricky one as it's practical use is different when compared to the standard, both ID3v2.2 and ID3v2.3 define this frame as follows. previously (in ID3v1.1, see genres) was stored as a one byte numeric value only, is now a numeric string. You may use one or several of the types as ID3v1.1 did or, since the category list would be impossible to maintain with accurate and up to date categories, define your own. References to the ID3v1 genres can be made by, as first byte, enter "(" followed by a number from the genres list and ended with a ")" character. This is optionally followed by a refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be made in the same frame, e.g. "(51)(39)". If the refinement should begin with a "(" character it should be replaced with "((", e.g. "((I can figure out any genre)" or "(55)((I think...)". The following new content types is defined in ID3v2 and is implemented in the same way as the numerig content types, e.g. "(RX)". However, the more practical use of this frame and what can be found in real world files is found in ID3v2.4's definition. This definition is as follows the 'Content type', which ID3v1 was stored as a one byte numeric value only, is now a string. You may use one or several of the ID3v1 types as numerical strings, or, since the category list would be impossible to maintain with accurate and up to date categories, define your own. Example: "21" $00 "Eurodisco" $00.

You may also use any of the following keywords:

Remix = "RX"
Cover = "CR"

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example 1:
  Frame ID = TCO
  Frame Size = $00 00 21
  Encoding = $00
  Information = "(9)(138)(137)Black Metal Melodic"
ID3v2.2 Example 2:
  Frame ID = TCO
  Frame Size = $00 00 14
  Encoding = $00
  Information = "Black Metal Melodic"
ID3v2.3 Example 1:
  Frame ID = TCON
  Frame Size = $00 00 00 1B
  Frame Flags = $00 00
  Encoding = $00
  Information = "(7)((experimental hip-hop)"
ID3v2.3 Example 2:
  Frame ID = TCON
  Frame Size = $00 00 00 15
  Frame Flags = $00 00
  Encoding = $00
  Information = "experimental hip-hop"
ID3v2.4 Example:
  Frame ID = TCON
  Frame Size = $00 00 00 15
  Frame Flags = $00 00
  Encoding = $03
  Information = "experimental hip-hop"
Bytes:
3
3
1
32

3
3
1
19

4
4
2
1
26

4
4
2
1
20

4
4
2
1
20

Copyright Message

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TCR

ID3v2.2

TCOP

ID3v2.3

TCOP

ID3v2.4

The 'Copyright message' frame, in which the string must begin with a year and a space character (making five characters), is intended for the copyright holder of the original sound, not the audio file itself. The absence of this frame means only that the copyright information is unavailable or has been removed, and must not be interpreted to mean that the audio is public domain. Every time this field is displayed the field must be preceded with the copyright symbol "©".

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TCR
  Frame Size = $00 00 57
  Encoding = $01
  Information = "© 2021 company CA, Inc All Rights Reserved"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TCOP
  Frame Size = $00 00 00 2F
  Frame Flags = $00 00
  Encoding = $00
  Information = "© 2021 company GB, limited All Rights Reserved"
Bytes:
3
3
1
86

4
4
2
1
46

Copyright/Legal Information

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WCP

ID3v2.2

WCOP

ID3v2.3

WCOP

ID3v2.4

The 'Copyright/Legal information' frame is a URL pointing at a webpage where the terms of use and ownership of the file is described.

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WCP
  Frame Size = $00 00 3E
  URL = "https://github.com/definitelyewan/ByteStream/blob/main/LICENSE"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WCOP
  Frame Size = $00 00 00 2C
  Frame Flags = $00 00
  URL = "https://www.gnu.org/licenses/gpl-3.0.en.html"
Bytes:
3
3
62

4
4
2
44

Date

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TDA

ID3v2.2

TDAT

ID3v2.3

ID3v2.4

The 'Date' frame is a numeric string in the DDMM format containing the date for the recording. This field is always four characters long.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TDA
  Frame Size = $00 00 05
  Encoding = $00
  Information = "1405"
ID3v2.3 Example:
  Frame ID = TDAT
  Frame Size = $00 00 00 05
  Frame Flags = $00 00
  Encoding = $00
  Information = "1911"
Bytes:
3
3
1
4

4
4
2
1
4

Encoded By

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TEN

ID3v2.2

TENC

ID3v2.3

TENC

ID3v2.4

The 'Encoded by' frame contains the name of the person or organisation that encoded the audio file. This field may contain a copyright message, if the audio file also is copyrighted by the encoder.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TEN
  Frame Size = $00 00 19
  Encoding = $00
  Information = "Sony Music Entertainment"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TENC
  Frame Size = $00 00 00 04
  Frame Flags = $00 00
  Encoding = $00
  Information = "UMG"
Bytes:
3
3
1
24

4
4
2
1
3

Encoding Time

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TDEN

ID3v2.4

The 'Encoding time' frame contains a timestamp describing when the audio was encoded. Timestamp format is defined as yyyy-MM-ddTHH:mm:ss (year, "-", month, "-", day, "T", hour (out of 24), ":", minutes, ":", seconds) or a subset.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TDEN
  Frame Size = $00 00 00 14
  Frame Flags = $00 00
  Encoding = $00
  Information = "2020-05-14T06:45:30"
Bytes:
4
4
2
1
19

Encrypted Meta Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
CRM

ID3v2.2

ID3v2.3

ID3v2.4

This frame contains one or more encrypted frames. This enables protection of copyrighted information such as pictures and text, that people might want to pay extra for. Since standardisation of such an encryption scheme is beyond this document, all "CRM" frames begin with a terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encrypted meta frame.

Questions regarding the encrypted frame should be sent to the indicated email address. If a $00 is found directly after the 'Frame size', the whole frame should be ignored, and preferably be removed. The 'Owner identifier' is then followed by a short content description and explanation as to why it's encrypted. After the 'content/explanation' description, the actual encrypted block follows.

When an ID3v2 decoder encounters a "CRM" frame, it should send the datablock to the 'plugin' with the corresponding 'owner identifier' and expect to receive either a datablock with one or several ID3v2 frames after each other or an error. There may be more than one "CRM" frames in a tag, but only one with the same 'owner identifier'.

The frames format is as follows:

Owner Identifier = [ISO-8859-1 encoded string] $00
Content/Explanation = [ISO-8859-1 encoded string] $00
Encrypted Datablock = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = CRM
  Frame Size = $00 02 7F
  Owner Identifier = "example@example.com" $00
  Content/Explanation = "reach out for keys" $00
  Encrypted Datablock = .....
Bytes:
3
3
20
19
600

Encryption Method Registration

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ENCR

ID3v2.3

ENCR

ID3v2.4

To identify with which method a frame has been encrypted the encryption method must be registered in the tag with this frame. The 'Owner identifier' is a null-terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encryption method. Questions regarding the encryption method should be sent to the indicated email address. The 'Method symbol' contains a value that is associated with this method throughout the whole tag, in the range $80-F0. All other values are reserved. The 'Method symbol' may optionally be followed by encryption specific data. There may be several "ENCR" frames in a tag but only one containing the same symbol and only one containing the same owner identifier. The method must be used somewhere in the tag. See the description of the frame encryption flag in the ID3v2 Frame structure section for more information.

The frames format is as follows:

Owner Identifier = [ISO-8859-1 encoded string] $00
Method Symbol = $xx
Encrypted Data = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = ENCR
  Frame Size = $00 00 07 19
  Frame Flags = $00 00
  Owner Identifier = "example@example.com" $00
  Method Symbol = $90
  Encrypted Data = .....
Bytes:
4
4
2
20
1
900

Equalization

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
EQU

ID3v2.2

EQUA

ID3v2.3

EQU2

ID3v2.4

The equalization frame is defined differently depending on the ID3v2 version and gradually supports more and more freatures. Below each format is defined in ascending order by verson number. It is worth noting that each equalization frame is a subjective, alignment frame no matter the version. However, the main purpose of this frame is to allows users to predefine an equalisation curve within the audio file.

In ID3v2.2 and ID3v2.3, the 'adjustment bits' field defines the number of bits used for representation of the adjustment. This is normally $10 (16 bits) for MPEG 2 layer I, II, III, and MPEG 2.5. This value may not be $00. This is followed by 2 bytes + ('adjustment bits' rounded up to the nearest byte) for every equalisation band in the following format, giving a frequency range of 0 - 32767Hz:

Increment/decrement = %x (MSB of the Frequency)
Frequency = (lower 15 bits)
Adjustment = $xx (xx ...)

The increment/decrement bit is 1 for increment and 0 for decrement. The equalisation bands should be ordered increasingly with reference to frequency. All frequencies don't have to be declared. Adjustments with the value $00 should be omitted. A frequency should only be described once in the frame.

The frames format is as follows:

Adjustment bits = $xx

Increment/decrement = %x (MSB of the Frequency)
Frequency = (lower 15 bits)
Adjustment = $xx (xx ...)
* one to many adjustments may be present

In ID3v2.4, The 'interpolation method' describes which method is preferred when an interpolation between the adjustment point that follows. The following methods are currently defined:

$00 = Band

No interpolation is made. A jump from one adjustment level to another occurs in the middle between two adjustment points.

$01 = Linear

Interpolation between adjustment points is linear.

The 'identification' string is used to identify the situation and/or device where this adjustment should apply. The following is then repeated for every adjustment point:

Frequency = $xx xx
Volume adjustment = $xx xx

The frequency is stored in units of 1/2 Hz, giving it a range from 0 to 32767 Hz. The volume adjustment is encoded as a fixed point decibel value, 16 bit signed integer representing (adjustment*512), giving +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 and -2 dB is $FC 00. Adjustment points should be ordered by frequency and one frequency should only be described once in the frame.

The frames format is as follows:

Interpolation method = $xx
Identification = [ISO-8859-1 encoded string] $00

Frequency = $xx xx
Volume adjustment = $xx xx
* one to many adjustments may be present

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = EQU
  Frame Size = $00 00 09
  Adjustment bits = $10
  Increment/decrement = %1
  Frequency = %000000111110100
  Adjustment = $40 00
  Increment/decrement = %0
  Frequency = %000000000010100
  Adjustment = $FC 00
ID3v2.3 Example:
  Frame ID = EQUA
  Frame Size = $00 00 00 05
  Frame Flags = $00 00
  Adjustment bits = $10
  Increment/decrement = %1
  Frequency = %000000001000000
  Adjustment = $44 20
ID3v2.4 Example:
  Frame ID = EQU2
  Frame Size = $00 00 00 0E
  Frame Flags = $00 00
  Interpolation method = $01
  Identification = "iPod"
  Frequency = $0B B8
  Volume Adjustment = $FC 00
  Frequency = $0C 1C
  Volume Adjustment = $44 20
Bytes:
3
3
1
1 (bits)
15 (bits)
2
1 (bits)
15 (bits)
2

4
4
2
1
1 (bits)
15 (bits)
2

4
4
2
1
5
2
2
2
2

Event Timing Codes

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
ETC

ID3v2.2

ETCO

ID3v2.3

ETCO

ID3v2.4

This frame allows synchronisation with key events in the audio. The header is:

Time stamp format = $xx

Where time stamp format is:

$01 = Absolute time, 32 bit sized, using MPEG frames as unit
$02 = Absolute time, 32 bit sized, using milliseconds as unit

Absolute time means that every stamp contains the time from the beginning of the file. Followed by a list of key events in the following format:

Type of event = $xx
Time stamp = $xx xx xx xx

The 'Time stamp' is set to zero if directly at the beginning of the sound or after the previous event. All events must be sorted in chronological order.

The type of event is as follows:

$00 = padding (has no meaning)
$01 = end of initial silence
$02 = intro start
$03 = main part start
$04 = outro start
$05 = outro end
$06 = verse start
$07 = refrain start
$08 = interlude start
$09 = theme start
$0A = variation start
$0B = key change
$0C = time change
$0D = momentary unwanted noise (Snap, Crackle & Pop)
$0E = sustained noise
$0F = sustained noise end
$10 = intro end
$11 = main part end
$12 = verse end
$13 = refrain end
$14 = theme end
$15 = profanity
$16 = profanity end
$17-$DF = reserved for future use
$E0-$EF = not predefined synch 0-F
$F0-$FC = reserved for future use
$FD = audio end (start of silence)
$FE = audio file ends
$FF = one more byte of events follows (all the following bytes with the value $FF have the same function)

Terminating the start events such as "intro start" is optional. The 'Not predefined synch's ($E0-EF) are for user events. You might want to synchronise your music to something, like setting off an explosion on-stage, activating a screensaver etc. There may only be one event timing codes frame in each tag.

The frames format is as follows:

Time stamp format = $xx

Type of event = $xx
Time stamp = $xx xx xx xx
* one to many events may be present

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = ETC
  Frame Size = $00 00 0B
  Time Stamp Format = $02
  Type of Event = $02
  Time Stamp = $00 00 00 00
  Type of Event = $10
  Time Stamp = $00 00 02 58
ID3v2.3 & ID3v2.4 Example:
  Frame ID = ETCO
  Frame Size = $00 00 00 10
  Frame Flags = $00 00
  Time Stamp Format = $02
  Type of Event = $09
  Time Stamp = $00 00 03 84
  Type of Event = $14
  Time Stamp = $00 00 09 60
  Type of Event = $0E
  Time Stamp = $00 00 09 61
Bytes:
3
3
1
1
4
1
4

4
4
2
1
1
4
1
4
1
4

File Type

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TEN

ID3v2.2

TENC

ID3v2.3

TENC

ID3v2.4

The 'File type' frame indicates which type of audio this tag defines. The following type and refinements are defined:

MIME = MIME type follows
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 Quantisation
PCM = Pulse Code Modulated Audio

but other types may be used, but not for these types though. This is used in a similar way to the predefined types in the media type frame, but without parentheses. If this frame is not present audio type is assumed to be "MPG".

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TFT
  Frame Size = $00 00 0D
  Encoding = $01
  Information = "MPG/1"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TFLT
  Frame Size = $00 00 00 08
  Frame Flags = $00 00
  Encoding = $03
  Information = "MPG/AAC"
Bytes:
3
3
1
12

4
4
2
1
7

File Owner/Licensee

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

TOWN

ID3v2.3

TOWN

ID3v2.4

The 'File owner/licensee' frame contains the name of the owner or licensee of the file and it's contents.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = TOWN
  Frame Size = $00 00 00 0A
  Frame Flags = $00 00
  Encoding = $00
  Information = "MIKE DEAN"
Bytes:
4
4
2
1
9

General Encapsulated Object

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
GEO

ID3v2.2

GEOB

ID3v2.3

GEOB

ID3v2.4

In this frame any type of file can be encapsulated. After the header, 'Frame size' and 'Encoding' follows 'MIME type' represented as as a terminated string encoded with ISO-8859-1. The filename is case sensitive and is encoded as 'Encoding'. Then follows a content description as terminated string, encoded as 'Encoding'. The last thing in the frame is the actual object. The first two strings may be omitted, leaving only their terminations. MIME type is always an ISO-8859-1 text string. There may be more than one general encapsulated object frame in each tag, but only one with the same content descriptor.

The frames format is as follows:

Encoding = $xx
MIME type = [ISO-8859-1 encoded string] $00
Filename = [n bytes of encoded data] $00 (00)
Content description = [n bytes of encoded data] $00 (00)
Encapsulated object = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = GEO
  Frame Size = $09 C4 25
  Encoding = $00
  MIME Type = "image/png" $00
  Filename = "band.png" $00
  Content Description = "members of julie" $00
  Encapsulated Object = ...
ID3v2.3 & ID3v2.4 Example:
  Frame ID = GEOB
  Frame Size = $02 43 3E 50
  Frame Flags = $00 00
  Encoding = $00
  MIME Type = "video/mp4" $00
  Filename = "julie_aesthetic.mp4" $00
  Content Description = "vibe of the song" $00
  Encapsulated Object = ...
Bytes:
3
3
1
10
9
17
640000

4
4
2
1
10
20
17
5300000

Group Identification Registration

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

GRID

ID3v2.3

GRID

ID3v2.4

This frame enables grouping of otherwise unrelated frames. This can be used when some frames are to be signed. To identify which frames belongs to a set of frames a group identifier must be registered in the tag with this frame. The 'Owner identifier' is a null-terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this grouping. Questions regarding the grouping should be sent to the indicated email address. The 'Group symbol' contains a value that associates the frame with this group throughout the whole tag, in the range $80-F0. All other values are reserved. The 'Group symbol' may optionally be followed by some group specific data, e.g. a digital signature. There may be several "GRID" frames in a tag but only one containing the same symbol and only one containing the same owner identifier. The group symbol must be used somewhere in the tag. See the description of the frame grouping flag in the ID3v2 frame structure for more information.

The frames format is as follows:

Owner identifier = [ISO-8859-1 encoded string] $00
Group symbol = $xx
Group dependent data = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = GRID
  Frame Size = $00 00 00 15
  Frame Flags = $00 00
  Owner Identifier = "example@example.com"
  Group Symbol = $09
  Group Dependent Data = $00
Bytes:
4
4
2
20
1
1

ISRC

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TRC

ID3v2.2

TSRC

ID3v2.3

TSRC

ID3v2.4

The 'ISRC' frame should contain the 12 character International Standard Recording Code. Information about how this code is structured can be be found on the International Federation of the Phonographic Industries domain.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TRC
  Frame Size = $00 00 0D
  Encoding = $00
  Information = "QMSDU1100020"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TSRC
  Frame Size = $00 00 00 1B
  Frame Flags = $00 00
  Encoding = $01
  Information = "SE6SA2190403"
Bytes:
3
3
1
12

4
4
2
1
26

Initial Key

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TKE

ID3v2.2

TKEY

ID3v2.3

TKEY

ID3v2.4

The 'Initial key' frame contains the musical key in which the sound starts. It is represented as a string with a maximum length of three characters. The ground keys are represented with "A","B","C","D","E", "F" and "G" and halfkeys represented with "b" and "#". Minor is represented as "m", e.g. "Dbm" $00. Off key is represented with an "o" only.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TKE
  Frame Size = $00 00 04
  Encoding = $00
  Information = "Dbm"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TKEY
  Frame Size = $00 00 00 02
  Frame Flags = $00 00
  Encoding = $00
  Information = "o"
Bytes:
3
3
1
3

4
4
2
1
1

Internet Radio Station Name

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

TRSN

ID3v2.3

TRSN

ID3v2.4

The 'Internet radio station name' frame contains the name of the internet radio station from which the audio is streamed.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = TRSN
  Frame Size = $00 00 00 12
  Frame Flags = $00 00
  Encoding = $00
  Information = "99.9 Virgin Radio""
Bytes:
4
4
2
1
17

Internet Radio Station Owner

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

TRSO

ID3v2.3

TRSO

ID3v2.4

The 'Internet radio station owner' frame contains the name of the owner of the internet radio station from which the audio is streamed.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = TRSO
  Frame Size = $00 00 00 0B
  Frame Flags = $00 00
  Encoding = $00
  Information = "Bell Media"
Bytes:
4
4
2
1
10

Interpreted, Remixed, or Modified By

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TP4

ID3v2.2

TPE4

ID3v2.3

TPE4

ID3v2.4

The 'Interpreted, remixed, or modified by' frame contains more information about the people behind a remix and similar interpretations of another existing piece.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TP4
  Frame Size = $00 00 09
  Encoding = $00
  Information = "Skrillex"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TPE4
  Frame Size = $00 00 00 04
  Frame Flags = $00 00
  Encoding = $00
  Information = "Zed"
Bytes:
3
3
1
8

4
4
2
1
3

Involved People List

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
IPL

ID3v2.2

IPLS

ID3v2.3

TIPL

ID3v2.4

This frame features the same functionality in both ID3v2.2 and ID3v2.3 however, is defined differently in ID3v2.4. In ID3v2.4 this frame is merged into the text frame family and allows the container writer to

In ID3v2.2 and ID3v2.3 this frame is defined as, there is usually a lot of people contributing to an audio file in various ways, such as musicians and technicians, the 'Text information frames' are often insufficient to list everyone involved in a project. The 'Involved people list' is a frame containing the names of those involved, and how they were involved. The body simply contains a terminated string with the involvement directly followed by a terminated string with the involvee followed by a new involvement and so on. There may only be one involved persons list frame in each tag.

The frames format is as follows:

Encoding = $xx

Role = [n bytes of encoded data] $00 (00)
Involvee = [n bytes of encoded data] ($00 (00))
* one to many roles and involved people may be present

However, in ID3v2.4 this structure is dropped to allow the container writer to define how to separate role and involvee.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = IPL
  Frame Size = $00 00 28
  Encoding = $00
  Role = "Mixer" $00
  Involvee = "John Doe" $00
  Role = "Engineering" $00
  Involvee = "Jane Doe" $00
ID3v2.3 Example:
  Frame ID = IPLS
  Frame Size = $00 00 00 1E
  Frame Flags = $00 00
  Encoding = $00
  Role = "Additional writing" $00
  Involvee = "Jack Antonoff" $00
ID3v2.4 Example:
  Frame ID = TIPL
  Frame Size = $00 00 00 2C
  Frame Flags = $00 00
  Encoding = $03
  Involvee = "Mixing, Jane Doe/song writing, Taylor swift"
Bytes:
3
3
1
6
9
12
9

4
4
2
1
19
9

4
4
2
1
43

Language(s)

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TLA

ID3v2.2

TLAN

ID3v2.3

TLAN

ID3v2.4

The 'Language' frame should contain the languages of the text or lyrics spoken or sung in the audio. The language is represented with three characters according to ISO-639-2. If more than one language is used in the text their language codes should follow according to the amount of their usage.

The frames format is as follows:

Encoding = $xx

Code = [n bytes of encoded data] ($00 (00))
* one to many code(s) may be present

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TLA
  Frame Size = $00 00 09
  Encoding = $01
  Code = "eng"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TLAN
  Frame Size = $00 00 00 08
  Frame Flags = $00 00
  Encoding = $00
  Code = "eng"
  Code = "sve"
Bytes:
3
3
1
8

4
4
2
1
3
3

Lead Performer(s)/Soloist(s)

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TP1

ID3v2.2

TPE1

ID3v2.3

TPE1

ID3v2.4

The 'Lead artist/Lead performer/Soloist/Performing group' is used for the main artist.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TP1
  Frame Size = $00 00 06
  Encoding = $00
  Information = "Drake"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TPE1
  Frame Size = $00 00 00 0A
  Frame Flags = $00 00
  Encoding = $00
  Information = "Daft Punk"
Bytes:
3
3
1
5

4
4
2
1
9

Length

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TLE

ID3v2.2

TLEN

ID3v2.3

TLEN

ID3v2.4

The 'Length' frame contains the length of the audio file in milliseconds, represented as a numeric string.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TLE
  Frame Size = $00 00 07
  Encoding = $00
  Information = "180000"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TLEN
  Frame Size = $00 00 00 07
  Frame Flags = $00 00
  Encoding = $03
  Information = "360000"
Bytes:
3
3
1
6

4
4
2
1
6

Linked Information

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
LNK

ID3v2.2

LINK

ID3v2.3

LINK

ID3v2.4

To keep information duplication as low as possible this frame may be used to link information from another ID3v2 tag that might reside in another audio file or alone in a binary file. It is recommended that this method is only used when the files are stored on a CD-ROM or other circumstances when the risk of file separation is low. The frame contains a frame identifier, which is the frame that should be linked into this tag, a URL [URL] field, where a reference to the file where the frame is given, and additional ID data, if needed. Data should be retrieved from the first tag found in the file to which this link points. There may be more than one linked information frame in a tag, but only one with the same contents. A linked frame is to be considered as part of the tag and has the same restrictions as if it was a physical part of the tag (i.e. only one "RVRB" frame allowed, whether it's linked or not).

The frames format is as follows:

URL = [ISO-8859-1 encoded string] $00
ID and additional data = [ISO-8859-1 encoded string]

Frames that may be linked and need no additional data are Seek Point Index, Event Timing Codes, Equalization, Music CD Identifier, MPEG Location Lookup Table, Ownership Frame, Relative Volume Adjustment, Reverb, Synchronised Tempo Codes, Recommended Buffer Size, text information frames, and URL link frames.

The Audio Encryption, Attached Picture, Encrypted Meta Frame, General Encapsulated Object, and User Defined Text Information Frame frames may be linked with the content descriptor as additional ID data.

The Terms of Use Frame may be linked with the language field as additional ID data.

The Private Frame may be linked with the owner identifier as additional ID data.

The Comments, Synchronised Lyric/Text, and Unsynchronised Lyric/Text Transcription frames may be linked with three bytes of language descriptor directly followed by a content descriptor as additional ID data.

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = LNK
  Frame Size = $00 00 05
  URL = "ETC"
  ID and additional data = $00"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = LINK
  Frame Size = $00 00 00 17
  Frame Flags = $00 00
  URL = "PRIV"
  ID and additional data = "example@example.com"
Bytes:
3
3
3
1

4
4
2
4
19

Lyricist/Text Writer

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TXT

ID3v2.2

TEXT

ID3v2.3

TEXT

ID3v2.4

The 'Lyricist/Text writer' frame is intended for the writer of the text or lyrics in the recording.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TXT
  Frame Size = $00 00 0D
  Encoding = $00
  Information = "Taylor Swift"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TEXT
  Frame Size = $00 00 00 1A
  Frame Flags = $00 00
  Encoding = $00
  Information = "Elizabeth Woolridge Grant"
Bytes:
3
3
1
12

4
4
2
1
25

MPEG Location Lookup Table

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
MLL

ID3v2.2

MLLT

ID3v2.3

MLLT

ID3v2.4

To increase performance and accuracy of jumps within a MPEG audio file, frames with time codes in different locations in the file might be useful. This ID3v2 frame includes references that the software can use to calculate positions in the file. After the frame header follows a descriptor of how much the "frame counter" should be increased for every reference. If this value is two then the first reference points out the second frame, the 2nd reference the 4th frame, the 3rd reference the 6th frame etc. In a similar way the 'bytes between reference' and 'milliseconds between reference' points out bytes and milliseconds respectively.

Each reference consists of two parts; a certain number of bits, as defined in 'bits for bytes deviation', that describes the difference between what is said in 'bytes between reference' and the reality and a certain number of bits, as defined in 'bits for milliseconds deviation', that describes the difference between what is said in 'milliseconds between reference' and the reality. The number of bits in every reference, i.e. 'bits for bytes deviation'+'bits for milliseconds deviation', must be a multiple of four. There may only be one MPEG location lookup table frame in each tag.

The frames format is as follows:

MPEG frames between reference = $xx xx
Bytes between reference = $xx xx xx
Milliseconds between reference = $xx xx xx
Bits for bytes deviation = $xx
Bits for milliseconds dev. = $xx

Deviation in bytes = %xxx...
Deviation in milliseconds = %xxx...
* one to many deviations may be present

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = MLL
  Frame Size = $00 00 0E
  MPEG frames between reference = $00 02
  Bytes between reference = $00 00 04
  Milliseconds between reference = $00 00 0A
  Bits for bytes deviation = $08
  Bits for milliseconds dev. = $04
  Deviation in bytes = %00001000
  Deviation in milliseconds = %00000101
  Deviation in bytes = %00010000
  Deviation in milliseconds = %00000010
ID3v2.3 & ID3v2.4 Example:
  Frame ID = MLLT
  Frame Size = $00 00 00 12
  Frame Flags = $00 00
  MPEG frames between reference = $00 04
  Bytes between reference = $00 00 08
  Milliseconds between reference = $00 00 12
  Bits for bytes deviation = $04
  Bits for milliseconds dev. = $02
  Deviation in bytes = %00001000
  Deviation in milliseconds = %00000101
  Deviation in bytes = %00010000
  Deviation in milliseconds = %00000010
  Deviation in bytes = %00100000
  Deviation in milliseconds = %00000100
  Deviation in bytes = %00110000
  Deviation in milliseconds = %00000011
Bytes:
3
3
2
3
3
1
1
1
1
1
1

4
4
2
2
3
3
1
1
1
1
1
1
1
1
1
1

Musician Credits List

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TMCL

ID3v2.4

The 'Musician credits list' is intended as a mapping between instruments and the musician that played it. Every odd field is an instrument and every even is an artist or a comma delimited list of artists. For the sake of consistency, each pairing will be separated by "/" so that it is easy to identify each tuple.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TMCL
  Frame Size = $00 00 00 27
  Frame Flags = $00 00
  Encoding = $03
  Information = "violin, Georgia Ellery/Bass, Tyler Hyde"
Bytes:
4
4
2
1
38

Media Type

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TMT

ID3v2.2

TMED

ID3v2.3

TMED

ID3v2.4

The 'Media type' frame describes from which media the sound originated. This may be a textstring or a reference to the predefined media types found in the list below. References are made within "(" and ")" and are optionally followed by a text refinement, e.g. "(MC) with four channels". If a text refinement should begin with a "(" character it should be replaced with "((" in the same way as in the Content Type frame. Predefined refinements is appended after the media type, e.g. "(CD/S)" or "(VID/PAL/VHS)".

The following type and refinements are defined:

DIG = Other digital media

/A = Analogue transfer from media

ANA = Other analogue media

/WAC = Wax cylinder
/8CA = 8-track tape cassette

CD = Compact disc

/A = Analogue transfer from media
/DD = DDD
/AD = ADD
/AA = AAD

LD = Laserdisc

TT = Turntable records

/33 = 33.33 rpm
/45 = 45 rpm
/71 = 71.29 rpm
/76 = 76.59 rpm
/78 = 78.26 rpm
/80 = 80 rpm

MD = MiniDisc

/A = Analogue transfer from media

DAT = DAT

/A = Analogue transfer from media
/1 = standard, 48 kHz/16 bits, linear
/2 = mode 2, 32 kHz/16 bits, linear
/3 = mode 3, 32 kHz/12 bits, non-linear, low speed
/4 = mode 4, 32 kHz/12 bits, 4 channels
/5 = mode 5, 44.1 kHz/16 bits, linear
/6 = mode 6, 44.1 kHz/16 bits, 'wide track' play

DCC = DCC

/A = Analogue transfer from media

DVD = DVD

/A = Analogue transfer from media

TV = Television

/PAL = PAL
/NTSC = NTSC
/SECAM = SECAM

VID = Video

/PAL = PAL
/NTSC = NTSC
/SECAM = SECAM
/VHS = VHS
/SVHS = S-VHS
/BETA = BETAMAX

RAD = Radio

/FM = FM
/AM = AM
/LW = LW
/MW = MW

TEL = Telephone

/I = ISDN

MC = MC (normal cassette)

/4 = 4.75 cm/s (normal speed for a two sided cassette)
/9 = 9.5 cm/s
/I = Type I cassette (ferric/normal)
/II = Type II cassette (chrome)
/III = Type III cassette (ferric chrome)
/IV = Type IV cassette (metal)

REE = Reel

/9 = 9.5 cm/s
/19 = 19 cm/s
/38 = 38 cm/s
/76 = 76 cm/s
/I = Type I cassette (ferric/normal)
/II = Type II cassette (chrome)
/III = Type III cassette (ferric chrome)
/IV = Type IV cassette (metal)

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TMT
  Frame Size = $00 00 06
  Encoding = $00
  Information = "DVD/A"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TMED
  Frame Size = $00 00 00 0A
  Frame Flags = $00 00
  Encoding = $00
  Information = "CD/A(ADD)"
Bytes:
3
3
1
5

4
4
2
1
9

Mood

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TMOO

ID3v2.4

The 'Mood' frame is intended to reflect the mood of the audio with a few keywords, e.g. "Romantic" or "Sad".

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TMOO
  Frame Size = $00 00 00 04
  Frame Flags = $00 00
  Encoding = $03
  Information = "Sad"
Bytes:
4
4
2
1
3

Music CD Identifier

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
MCI

ID3v2.2

MCDI

ID3v2.3

MCDI

ID3v2.4

This frame is intended for music that comes from a CD, so that the CD can be identified in databases such as the CDDB. The frame consists of a binary dump of the Table Of Contents from the CD, which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 bytes for the 'lead out', making a maximum of 804 bytes. The offset to the beginning of every track on the CD should be described with a four bytes absolute CD-frame address per track, and not with absolute time. When this frame is used the presence of a valid Track Number/Position in Set frame is required, even if the CD's only has one track. It is recommended that this frame is always added to tags originating from CDs. There may only be one Music CD Identifier frame in each tag.

The frames format is as follows:

Table of contents = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = MCI
  Frame Size = $00 00 20
  Table of Contents = ...
ID3v2.3 & ID3v2.4 Example:
  Frame ID = MCDI
  Frame Size = $00 00 06 24
  Frame Flags = $00 00
  Table of Contents = ...
Bytes:
3
3
32

4
4
2
804

Official Internet Radio Station Homepage

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

WORS

ID3v2.3

WORS

ID3v2.4

The 'Official Internet radio station homepage' contains a URL pointing at the homepage of the internet radio station. The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = WORS
  Frame Size = $00 00 00 18
  Frame Flags = $00 00
  URL = "https://www.kiss925.com/"
Bytes:
4
4
2
24

Official Artist/Performer Webpage

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WAR

ID3v2.2

WOAR

ID3v2.3

WOAR

ID3v2.4

The 'Official artist/performer webpage' frame is a URL pointing at the artists official webpage. There may be more than one of this frame type in a tag if the audio contains more than one performer, but not with the same content.

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WAR
  Frame Size = $00 00 17
  URL = "https://thirdworlds.net"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WOAR
  Frame Size = $00 00 00 1B
  Frame Flags = $00 00
  URL = "https://www.arcadefire.com/"
Bytes:
3
3
23

4
4
2
27

Official Audio File Webpage

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WAF

ID3v2.2

WOAF

ID3v2.3

WOAF

ID3v2.4

The 'Official audio file webpage' frame is a URL pointing at a file specific webpage.

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WAF
  Frame Size = $00 00 34
  URL = "https://parannoul.bandcamp.com/track/beautiful-world"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WOAF
  Frame Size = $00 00 00 45
  Frame Flags = $00 00
  URL = "https://soundcloud.com/jahseh-onfroy/willy-wonka-was-a-child-murderer"
Bytes:
3
3
52

4
4
2
69

Official Audio Source Webpage

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WAS

ID3v2.2

WOAS

ID3v2.3

WOAS

ID3v2.4

The 'Official audio source webpage' frame is a URL pointing at the official webpage for the source of the audio file, e.g. a movie.

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WAS
  Frame Size = $00 00 34
  URL = "https://parannoul.bandcamp.com/track/beautiful-world"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WOAS
  Frame Size = $00 00 00 45
  Frame Flags = $00 00
  URL = "https://soundcloud.com/jahseh-onfroy/willy-wonka-was-a-child-murderer"
Bytes:
3
3
52

4
4
2
69

Original Album/Movie/Show Title

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TOT

ID3v2.2

TOAL

ID3v2.3

TOAL

ID3v2.4

The 'Original album/movie/show title' frame is intended for the title of the original recording (or source of sound), if for example the music in the file should be a cover of a previously released song.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TOT
  Frame Size = $00 00 0B
  Encoding = $00
  Information = "Family Guy"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TOAL
  Frame Size = $00 00 00 0C
  Frame Flags = $00 00
  Encoding = $00
  Information = "Invader Zim"
Bytes:
3
3
1
10

4
4
2
1
11

Original artist(s)/performer(s)

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TOA

ID3v2.2

TOPE

ID3v2.3

TOPE

ID3v2.4

The 'Original artist/performer' frame is intended for the performer of the original recording, if for example the music in the file should be a cover of a previously released song.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TOA
  Frame Size = $00 00 07
  Encoding = $00
  Information = "Mitski"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TOPE
  Frame Size = $00 00 00 0A
  Frame Flags = $00 00
  Encoding = $00
  Information = "Radiohead"
Bytes:
3
3
1
6

4
4
2
1
9

Original Filename

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TOF

ID3v2.2

TOFN

ID3v2.3

TOFN

ID3v2.4

The 'Original filename' frame contains the preferred filename for the file, since some media doesn't allow the desired length of the filename. The filename is case sensitive and includes its suffix.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TOF
  Frame Size = $00 00 11
  Encoding = $01
  Information = "iMi.mp3"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TOFN
  Frame Size = $00 00 00 13
  Frame Flags = $00 00
  Encoding = $00
  Information = "01_sorry4dying.mp3"
Bytes:
3
3
1
16

4
4
2
1
18

Original Lyricist(s)/Text Writer(s)

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TOL

ID3v2.2

TOLY

ID3v2.3

TOLY

ID3v2.4

The 'Original lyricist/text writer' frame is intended for the text writer of the original recording, if for example the music in the file should be a cover of a previously released song.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TOL
  Frame Size = $00 00 0E
  Encoding = $00
  Information = "Leonard Cohen"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TOLY
  Frame Size = $00 00 00 10
  Frame Flags = $00 00
  Encoding = $00
  Information = "Francoise Hardy"
Bytes:
3
3
1
13

4
4
2
1
15

Original Release Time

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TDOR

ID3v2.4

The 'Original release time' frame contains a timestamp describing when the original recording of the audio was released. Timestamp format is defined as follows yyyy-MM-ddTHH:mm:ss or a subset of the format.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TDOR
  Frame Size = $00 00 00 14
  Frame Flags = $00 00
  Encoding = $03
  Information = "2022-04-15T13:15:02"
Bytes:
4
4
2
1
19

Original Release Year

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TOL

ID3v2.2

TOLY

ID3v2.3

ID3v2.4

The 'Original release year' frame is intended for the year when the original recording, if for example the music in the file should be a cover of a previously released song, was released. The field is formatted as in the Year frame.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TOL
  Frame Size = $00 00 05
  Encoding = $00
  Information = "1947"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TOLY
  Frame Size = $00 00 00 05
  Frame Flags = $00 00
  Encoding = $00
  Information = "2000"
Bytes:
3
3
1
4

4
4
2
1
4

Ownership

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

OWNE

ID3v2.3

OWNE

ID3v2.4

The ownership frame might be used as a reminder of a made transaction or, if signed, as proof. Note that the Terms of Use frame and File Owner/Licensee frame frames are good to use in conjunction with this one. The frame begins, after the frame ID, size and encoding fields, with a 'price paid' field. The first three characters of this field contains the currency used for the transaction, encoded according to ISO-4217 alphabetic currency code. Concatenated to this is the actual price paid, as a numerical string using "." as the decimal separator. Next is an 8 character date string (YYYYMMDD) followed by a string with the name of the seller as the last field in the frame. There may only be one ownership frame in a tag. The Original Release Year frame is intended for the year when the original recording, if for example the music in the file should be a cover of a previously released song, was released. The field is formatted as in the Year frame.

The frames format is as follows:

Encoding = $xx
Price payed = [ISO-8859-1 encoded string] $00
Date of purch. = [ISO-8859-1 encoded string]
Seller = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = OWNE
  Frame Size = $00 00 00 1B
  Frame Flags = $00 00
  Encoding = $01
  Price Payed = "CAD0.99" $00
  Date of Purch. = "20010520"
  Seller = "iTunes"
Bytes:
4
4
2
1
8
4
14

Part of a Set

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TPA

ID3v2.2

TPOS

ID3v2.3

TPOS

ID3v2.4

The 'Part of a set' frame is a numeric string that describes which part of a set the audio came from. This frame is used if the source described in the Album/Movie/Show Title frame is divided into several mediums, e.g. a double CD. The value MAY be extended with a "/" character and a numeric string containing the total number of parts in the set. E.g. "1/2".

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TPA
  Frame Size = $00 00 05
  Encoding = $00
  Information = "1/10"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TPOS
  Frame Size = $00 00 00 0D
  Frame Flags = $00 00
  Encoding = $01
  Information = "15/25"
Bytes:
3
3
1
4

4
4
2
1
12

Payment

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

WPAY

ID3v2.3

WPAY

ID3v2.4

The 'Payment' frame is a URL pointing at a webpage that will handle the process of paying for this file.

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = WPAY
  Frame Size = $00 00 00 30
  Frame Flags = $00 00
  URL = "https://chatpile.bandcamp.com/album/gods-country"
Bytes:
4
4
2
48

Performer Sort Order

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TSOP

ID3v2.4

The 'Performer sort order' frame defines a string which should be used instead of the performer (TPE2) for sorting purposes.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TSOP
  Frame Size = $00 00 00 07
  Frame Flags = $00 00
  Encoding = $03
  Information = "twoPac"
Bytes:
4
4
2
1
6

Play Counter

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
CNT

ID3v2.2

PCNT

ID3v2.3

PCNT

ID3v2.4

This is simply a counter of the number of times a file has been played. The value is increased by one every time the file begins to play. There may only be one Play Counter frame in each tag. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger. The counter must be at least 32-bits long to begin with. For example, if the counter section is 32-bits and 10 of them are set to 1, the file has been played 10 times.

This frame is formated as:

Counter = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = CNT
  Frame Size = $00 00 04
  Counter = %00000001111111111111111111111111
ID3v2.3 & ID3v2.4 Example:
  Frame ID = PCNT
  Frame Size = $00 00 00 04
  Frame Flags = $00 00
  Counter = %00000000000000000000000000000001
Bytes:
3
3
4

4
4
2
4

Playlist Delay

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TDY

ID3v2.2

TDLY

ID3v2.3

TDLY

ID3v2.4

The 'Playlist delay' defines the numbers of milliseconds of silence that should be inserted before this audio. The value zero indicates that this is a part of a multifile audio track that should be played continuously.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TDY
  Frame Size = $00 00 05
  Encoding = $00
  Information = "3000"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TDLY
  Frame Size = $00 00 00 02
  Frame Flags = $00 00
  Encoding = $00
  Information = "0"
Bytes:
3
3
1
4

4
4
2
1
1

Popularimeter

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
POP

ID3v2.2

POPM

ID3v2.3

POPM

ID3v2.4

The purpose of this frame is to specify how good an audio file is. Many interesting applications could be found to this frame such as a playlist that features better audio files more often than others or it could be used to profile a person's taste and find other 'good' files by comparing people's profiles. The frame contains the email address to the user, one rating byte and a four byte play counter, intended to be increased with one for every time the file is played. The email is a terminated string. The rating is 1-255 where 1 is worst and 255 is best. 0 is unknown. If no personal counter is wanted it may be omitted. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger in the same away as the Play Counter frame. There may be more than one Popularimeter frame in each tag, but only one with the same email address.

This frame is formated as:

User email = [ISO-8859-1 encoded string] $00
Rating = $xx
Counter = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = POP
  Frame Size = $00 00 14
  User Email = "example@e.com"
  Rating = $C8
  Counter = %0011111111111111111111111111111111111111
ID3v2.3 & ID3v2.4 Example:
  Frame ID = POPM
  Frame Size = $00 00 00 13
  Frame Flags = $00 00
  Frame Size = $00 00 05
  User Email = "user@test.com"
  Rating = $AF
  Counter = %00000000111111111111111111111111
Bytes:
3
3
14
1
5

4
4
2
3
14
1
4

Position Synchronisation

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

POSS

ID3v2.3

POSS

ID3v2.4

This frame delivers information to the listener of how far into the audio stream he picked up; in effect, it states the time offset from the first frame in the stream.

The frames format is as follows:

Time stamp format = $xx
Position = $xx

Where time stamp format is:

$01 = Absolute time, 32 bit sized, using MPEG frames as unit
$02 = Absolute time, 32 bit sized, using milliseconds as unit

and position is where in the audio the listener starts to receive, i.e. the beginning of the next frame. If this frame is used in the beginning of a file the value is always 0. There may only be one Position Synchronisation frame in each tag.

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = POSS
  Frame Size = $00 00 00 02
  Frame Flags = $00 00
  Time Stamp Format = $01
  Position = $00
Bytes:
4
4
2
1
1

Private Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

PRIV

ID3v2.3

PRIV

ID3v2.4

This frame is used to contain information from a software producer that its program uses and does not fit into the other frames. The frame consists of an 'Owner identifier' string and the binary data. The 'Owner identifier' is a null-terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for the frame. Questions regarding the frame should be sent to the indicated email address. The tag may contain more than one Private frame but only with different contents.

The frames format is as follows:

Owner identifier = [ISO-8859-1 encoded string] $00
Private data = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Frame ID = PRIV
  Frame Size = $00 00 00 12
  Frame Flags = $00 00
  Owner Identifier = "info@private.com"
  Private Data = $00
Bytes:
4
4
2
17
1

Produced Notice

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TPRO

ID3v2.4

The 'Produced notice' frame, in which the string must begin with a year and a space character (making five characters), is intended for the production copyright holder of the original sound, not the audio file itself. The absence of this frame means only that the production copyright information is unavailable or has been removed, and must not be interpreted to mean that the audio is public domain. Every time this field is displayed the field must be preceded with "Produced " ⓟ " ". Note, ⓟ is not available in ISO-8859-1 (encoding $00) thus, different encodings must be used.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Frame ID = TPRO
  Frame Size = $00 00 00 21
  Frame Flags = $00 00
  Encoding = $02
  Information = "Produced ⓟ Arca"
Bytes:
4
4
2
1
32

Publisher

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TPB

ID3v2.2

TPUB

ID3v2.3

TPUB

ID3v2.4

The 'Publisher' frame simply contains the name of the label or publisher.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TPB
  Frame Size = $00 00 22
  Encoding = $00
  Information = "Death Row Records"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TPUB
  Frame Size = $00 00 00 10
  Frame Flags = $00 00
  Encoding = $00
  Information = "Bad Boy Records"
Bytes:
3
3
1
17

4
4
2
1
15

Publishers Official Webpage

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WPB

ID3v2.2

WPUB

ID3v2.3

WPUB

ID3v2.4

The 'Publishers official webpage' frame is a URL pointing at the official webpage for the publisher. The frames format is as follows:

The frames format is as follows:

URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WPB
  Frame Size = $00 00 21
  URL = "https://www.deathrowofficial.com/"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WPUB
  Frame Size = $00 00 00 2E
  Frame Flags = $00 00
  URL = "https://combsglobal.com/bad-boy-entertainment/"
Bytes:
3
3
33

4
4
2
46

Recommended Buffer Size

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
BUF

ID3v2.2

RBUF

ID3v2.3

RBUF

ID3v2.4

Sometimes the server from which an audio file is streamed is aware of transmission or coding problems resulting in interruptions in the audio stream. In these cases, the size of the buffer can be recommended by the server using this frame. If the 'embedded info flag' is set then this indicates that an ID3 tag with the maximum size described in 'Buffer size' may occur in the audio stream. In such case the tag should reside between two MPEG frames, if the audio is MPEG encoded. If the position of the next tag is known, 'offset to next tag' may be used. The offset is calculated from the end of tag in which this frame resides to the first byte of the header in the next. This field may be omitted. Embedded tags are generally not recommended since this could render unpredictable behaviour from present software/hardware.

For applications like streaming audio it might be an idea to embed tags into the audio stream though. If the clients connects to individual connections like HTTP and there is a possibility to begin every transmission with a tag, then this tag should include a 'recommended buffer size' frame. If the client is connected to a arbitrary point in the stream, such as radio or multicast, then the 'recommended buffer size' frame should be included in every tag.

This frame is formated as:

Buffer size = $xx xx xx
Embedded info flag = %0000000x
Offset to next tag = $xx xx xx xx

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = BUF
  Frame Size = $00 00 04
  Buffer Size = 00 01 F4
  Embedded Into Flag = %00000001
ID3v2.3 & ID3v2.4 Example:
  Frame ID = RBUF
  Frame Size = $00 00 00 00
  Frame Flags = $00 00
  Buffer Size = 00 01 F4
  Embedded Into Flag = %00000001
  Offset To Next Tag = $00 01 5F 90
Bytes:
3
3
3
1

4
4
2
3
1
4

Recording Dates

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TRD

ID3v2.2

TRDA

ID3v2.3

ID3v2.4

The 'Recording dates' frame is a intended to be used as complement to the Year, Date and Time frames. E.g. "4th-7th June, 12th June" in combination with the Year frame.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TRD
  Frame Size = $00 00 18
  Encoding = $00
  Information = "4th-7th June, 12th June"
ID3v2.3 Example:
  Information = TRDA
  Frame Size = $00 00 00 10
  Frame Flags = $00 00
  Encoding = $00
  Information = "15th-20th April"
Bytes:
3
3
1
17

4
4
2
1
15

Recording Time

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TDRC

ID3v2.4

The 'Recording time' frame contains a timestamp describing when the audio was recorded. Timestamp format is described in as yyyy-MM-ddTHH:mm:ss or a subset of the stated format.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = TDRC
  Frame Size = $00 00 00 0B
  Frame Flags = $00 00
  Encoding = $03
  Information = "1999-01-06"
Bytes:
4
4
2
1
10

Relative Volume Adjustment

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
RVA

ID3v2.2

RVAD

ID3v2.3

RVA2

ID3v2.4

The purpose of this frame is to allow the tagger to define a set volume level for the sake of the end user. However, this frame has a different definition depending on the desired standard. formats for this frame will be listed in ascending order from ID3v2.2 to ID3v2.4.

ID3v2.2 and ID3v2.3 have a similar definition for the 'Relative volume adjustment' frame with the only difference being that ID3v2.3 offers more options. It allows the user to say how much he or she wants to increase/decrease the volume on each channel while the file is played. The purpose is to be able to align all files to a reference volume, so that you don't have to change the volume constantly. This frame may also be used to balance or adjust the audio. If the volume peak levels are known then this could be described with the 'Peak volume right' and 'Peak volume left' field. If Peakvolume is not known these fields could be left zeroed or, if no other data follows, be completely omitted. There may only be one 'Relative volume adjustment' frame in each tag. This version of the frame is formated as:

Increment/decrement = %00yyyyxx *
Bits used for volume descr. = $xx
Relative volume change, right = $xx xx (xx ...)
Relative volume change, left = $xx xx (xx ...)
Peak volume right = $xx xx (xx ...)
Peak volume left = $xx xx (xx ...)
*options labeled as 'y' are only available in ID3v2.3 and will be ignored by an ID3v2.2 decoder

In the 'Increment/decrement' field bit 0 is used to indicate the right channel and bit 1 is used to indicate the left channel. 1 is increment and 0 is decrement. These bits are labeled as 'x' in the frames format above. The 'Bits used for volume descr.' field is normally $10 (16 bits) for MPEG 2 layer I, II, III, and MPEG 2.5. This value may not be $00. The volume is always represented with whole bytes, padded in the beginning (highest bits) when 'Bits used for volume descr.' is not a multiple of eight.

As stated prior ID3v2.3 has more options when compared to ID3v2.2 and can be accessed by setting the bits marked with 'y' in the Increment/decrement section, These are defined below.

The datablock is then optionally followed by a volume definition for the left and right back channels. If this information is appended to the frame the first two channels will be treated as front channels. In the 'Increment/decrement' field bit 2 is used to indicate the right back channel and bit 3 for the left back channel.

Relative volume change, right back = $xx xx (xx ...)
Relative volume change, left back = $xx xx (xx ...)
Peak volume right = $xx xx (xx ...)
Peak volume left = $xx xx (xx ...)

If the center channel adjustment is present the following is appended to the existing frame, after the left and right back channels. The center channel is represented by bit 4 in the 'Increase/decrement' field.

Relative volume change, center = $xx xx (xx ...)
Peak volume center = $xx xx (xx ...)

If the bass channel adjustment is present the following is appended to the existing frame, after the center channel. The bass channel is represented by bit 5 in the 'Increase/decrement' field.

Relative volume change, bass = $xx xx (xx ...)
Peak volume bass = $xx xx (xx ...)

In ID3v2.4 all of the above information is discarded in favour of a redefinition of the 'Relative volume adjustment' frame. It's goal is the exact same except, The volume adjustment is encoded as a fixed point decibel value, 16 bit signed integer representing (adjustment*512), giving +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 and -2 dB is $FC 00. There may be more than one 'Relative volume adjustment' frame in each tag, but only one with the same identification string. The 'identification' string is used to identify the situation and/or device where this adjustment should apply. 'Bits representing peak' can be any number between 0 and 255. 0 means that there is no 'Peak volume' field. The peak volume field is always padded to whole bytes, setting the most significant bits to zero. This version of the frame is formated as:

Identification = [ISO-8859-1 encoded string] $00

Type of channel = $xx
Volume adjustment = $xx xx
Bits representing peak = $xx
Peak volume = $xx xx (xx ...)
* one to many adjustments may be present

They type of adjustment field is defined below:

$00 = Other
$01 = Master volume
$02 = Front right
$03 = Front left
$04 = Back right
$05 = Back left
$06 = Front centre
$07 = Back centre
$08 = Subwoofer

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = RVA
  Frame Size = $00 00 0A
  Increment/Decrement = %00000011
  Bits Used For Volume Descr. = $10
  Relative Volume Change, Right = $42 48
  Relative Volume Change, Left = $42 48
  Peak Volume Right = $78 00
  Peak Volume Left = $78 00
ID3v2.3 Example:
  Frame ID = RVAB
  Frame Size = $00 00 00 16
  Frame Flags = $00 00
  Increment/Decrement = %00101111
  Bits Used For Volume Descr. = $10
  Relative Volume Change, Right Front = $42 48
  Relative Volume Change, Front Front = $42 48
  Peak Volume Right = $78 00
  Peak Volume Left = $78 00
  Relative Volume Change, Right Back = $42 4B
  Relative Volume Change, Left Back = $42 4B
  Peak Volume Right = $78 00
  Peak Volume Left = $78 00
  Relative Volume Change, Bass = $52 53
  Peak Volume Bass = $78 00
ID3v2.4 Example:
  Frame ID = RVA2
  Frame Size = $00 00 00 16
  Frame Flags = $00 00
  Identification = "iPod" $00
  Type of Channel = $01
  Bits Representing Peak = $10
  Peak Volume = $FC 00
Bytes:
3
3
1
1
2
2
2
2

4
4
2
1
1
2
2
2
2
2
2
2
2
2
2

4
4
2
5
1
1
2

Release Time

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TDRL

ID3v2.4

The 'Release time' frame contains a timestamp describing when the audio was first released. Timestamp format is defined as yyyy-MM-ddTHH:mm:ss or a subset.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = TDRL
  Frame Size = $00 00 00 14
  Frame Flags = $00 00
  Encoding = $03
  Information = "2022-04-15T13:15:02"
Bytes:
4
4
2
1
19

Reverb

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
REV

ID3v2.2

RVRB

ID3v2.3

RVRB

ID3v2.4

Yet another subjective frame, with which you can adjust echoes of different kinds. Reverb left/right is the delay between every bounce in ms. Reverb bounces left/right is the number of bounces that should be made. $FF equals an infinite number of bounces. Feedback is the amount of volume that should be returned to the next echo bounce. $00 is 0%, $FF is 100%. If this value were $7F, there would be 50% volume reduction on the first bounce, 50% of that on the second and so on. Left to left means the sound from the left bounce to be played in the left speaker, while left to right means sound from the left bounce to be played in the right speaker.

'Premix left to right' is the amount of left sound to be mixed in the right before any reverb is applied, where $00 id 0% and $FF is 100%. 'Premix right to left' does the same thing, but right to left. Setting both premix to $FF would result in a mono output (if the reverb is applied symmetric). There may only be one "RVRB" frame in each tag.

This frame is formated as:

Reverb left (ms) = $xx xx
Reverb right (ms) = $xx xx
Reverb bounces, left = $xx
Reverb bounces, right = $xx
Reverb feedback, left to left = $xx
Reverb feedback, left to right = $xx
Reverb feedback, right to right = $xx
Reverb feedback, right to left = $xx
Premix left to right = $xx
Premix right to left = $xx

See below for an example of what this frame could look like:

ID3v2.2 Example:
Frame ID = REV
Frame Size = $00 00 0C
Reverb left (ms) = $00 64
Reverb right (ms) = $00 C8
Reverb bounces, left = $05
Reverb bounces, right = $0A
Reverb feedback, left to left = $7F
Reverb feedback, left to right = $3F
Reverb feedback, right to right = $7F
Reverb feedback, right to left = $3F
Premix left to right = $7F
Premix right to left = $00
ID3v2.3 & ID3v2.4 Example:
Frame ID = RVRB
Frame Size = $00 00 00 0C
Frame Flags = $00 00
Reverb left (ms) = $00 3E
Reverb right (ms) = $00 78
Reverb bounces, left = $03
Reverb bounces, right = $04
Reverb feedback, left to left = $80
Reverb feedback, left to right = $40
Reverb feedback, right to right = $80
Reverb feedback, right to left = $40
Premix left to right = $80
Premix right to left = $00
Bytes:
3
3
2
2
1
1
1
1
1
1
1
1

4
4
2
2
2
1
1
1
1
1
1
1
1

Seek Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

SEEK

ID3v2.4

This frame indicates where other tags in a file/stream can be found. The 'minimum offset to next tag' is calculated from the end of this tag to the beginning of the next. There may only be one 'seek frame' in a tag.

The frames format is as follows:

Minimum offset to next tag = $xx xx xx xx

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = SEEK
  Frame Size = $00 00 00 04
  Frame Flags = $00 00
  Minimum Offset To Next Tag = $00 01 30 F5
Bytes:
4
4
2
4

Seek Point Index

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

ASPI

ID3v2.4

Audio files with variable bit rates are intrinsically difficult to deal with in the case of seeking within the file. The 'audio seek point index' frame makes seeking easier by providing a list of seek points within the audio file. The seek points are a fractional offset within the audio data, providing a starting point from which to find an appropriate point to start decoding. The presence of an 'audio seek point index' frame requires the existence of a Length frame, indicating the duration of the file in milliseconds. There may only be one 'audio seek point index' frame in a tag.

The frames format is as follows:

Indexed data start (S) = $xx xx xx xx
Indexed data length (L) = $xx xx xx xx
Number of index points (N) = $xx xx
Bits per index point (b) = $xx

Fraction at index (Fi) = $xx (xx)
* there may be one to many Fractions

'Indexed data start' is a byte offset from the beginning of the file. 'Indexed data length' is the byte length of the audio data being indexed. 'Number of index points' is the number of index points, as the name implies. The recommended number is 100. 'Bits per index point' is 8 or 16, depending on the chosen precision. 8 bits works well for short files (less than 5 minutes of audio), while 16 bits is advantageous for long files. 'Fraction at index' is the numerator of the fraction representing a relative position in the data. The denominator is 2 to the power of b.

Here are the algorithms to be used in the calculation. The known data must be the offset of the start of the indexed data (S), the offset of the end of the indexed data (E), the number of index points (N), the offset at index i (Oi). We calculate the fraction at index i (Fi).

Oi is the offset of the frame whose start is soonest after the point for which the time offset is (i/N * duration).

The frame data should be calculated as follows:

Fi = Oi/L * 2^b (rounded down to the nearest integer)

Offset calculation should be calculated as follows from data in the frame:

Oi = (Fi/2^b)*L (rounded up to the nearest integer)

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = ASPI
  Frame Size = $00 00 00 11
  Frame Flags = $00 00"
  Indexed Data Start = $00 00 00 00
  Indexed Data Length = $00 00 A0 00
  Number Of Index Points = $00 03
  Bits Per Index Point = $08
  Fraction At Index = 00 10
  Fraction At Index = 00 20
  Fraction At Index = 00 30
Bytes:
4
4
2
4
4
2
1
2
2
2

Set Subtitle

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TSST

ID3v2.4

The 'Set subtitle' frame is intended for the subtitle of the part of a set this track belongs to.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = TSST
  Frame Size = $00 00 00 17
  Frame Flags = $00 00"
  Encoding = $03
  Information = "Soundtrack"
Bytes:
4
4
2
1
22

Signature Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

SIGN

ID3v2.4

This frame enables a group of frames, grouped with the Group identification registration, to be signed. Although signatures can reside inside the registration frame, it might be desired to store the signature elsewhere, e.g. in watermarks. There may be more than one 'signature frame' in a tag, but no two may be identical.

This frame is formated as:

Group symbol = $xx
Signature = [n bytes of binary data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = SIGN
  Frame Size = $00 00 00 6B
  Frame Flags = $00 00
  group Synbol = $09
  Information = ...
Bytes:
4
4
2
1
106

Size

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TSI

ID3v2.2

TSIZ

ID3v2.3

ID3v2.4

The 'Size' frame contains the size of the audiofile in bytes excluding the tag, represented as a numeric string.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TSI
  Frame Size = $00 00 11
  Encoding = $01
  Information = "3670016"
ID3v2.3 & ID3v2.4 Example:
  Information = TSIZ
  Frame Size = $00 00 00 09
  Frame Flags = $00 00
  Encoding = $00
  Information = "10590617"
Bytes:
3
3
1
16

4
4
2
1
8

Software/Hardware And Settings Used For Encoding

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TSS

ID3v2.2

TSSE

ID3v2.3

TSSE

ID3v2.4

The 'Software/Hardware and settings used for encoding' frame includes the used audio encoder and its settings when the file was encoded. Hardware refers to hardware encoders, not the computer on which a program was run.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TSS
  Frame Size = $00 00 12
  Encoding = $00
  Information = "LAME 3.100 -b 320"
ID3v2.3 & ID3v2.4 Example:
  Information = TSSE
  Frame Size = $00 00 00 0F
  Frame Flags = $00 00"
  Encoding = $00
  Information = "LAME 3.100 -V 0"
Bytes:
3
3
1
17

4
4
2
1
15

Subtitle/Description Refinement

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TT3

ID3v2.2

TIT3

ID3v2.3

TIT3

ID3v2.4

The 'Subtitle/Description refinement' frame is used for information directly related to the contents title (e.g. "Op. 16" or "Performed live at Wembley").

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TT3
  Frame Size = $00 00 1A
  Encoding = $00
  Information = "Performed live at History"
ID3v2.3 & ID3v2.4 Example:
  Information = TIT3
  Frame Size = $00 00 00 15
  Frame Flags = $00 00"
  Encoding = $00
  Information = "Opener from Scilence"
Bytes:
3
3
1
25

4
4
2
1
20

Synchronised Lyric/Text

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
SLT

ID3v2.2

SYLT

ID3v2.3

SYLT

ID3v2.4

This is a way of incorporating the words, said or sung lyrics, in the audio file as text, this time, however, in sync with the audio. It might also be used to describing events e.g. occurring on a stage or on the screen in sync with the audio. The header includes a content descriptor, represented with as terminated text string. If no descriptor is entered, 'Content descriptor' is $00 (00) only.

The frames format is as follows:

Encoding = $xx
Language = $xx xx xx
Time stamp format = $xx
Content type = $xx
Content descriptor = [n bytes of encoded data] $00 (00)

Time stamp format is defined as:

$01 = Absolute time, 32 bit sized, using MPEG frames as unit
$02 = Absolute time, 32 bit sized, using milliseconds as unit

Absolute time means that every stamp contains the time from the beginning of the file.

Content type is defined as:

$00 = other
$01 = lyrics
$02 = text transcription
$03 = movement/part name (e.g. "Adagio")
$04 = events (e.g. "Don Quijote enters the stage")
$05 = chord (e.g. "Bb F Fsus")
$06 = trivia/'pop up' information
$07 = URLs to webpages
$08 = URLs to images

Each syllable (or whatever size of text is considered to be convenient by the encoder) is a null terminated string followed by a time stamp denoting where in the sound file it belongs. Each sync thus has the following structure:

Terminated text to be synced (typically a syllable) = [n bytes of encoded data]
Sync identifier (terminator to above string) = $00 (00)
Time stamp = $xx (xx ...)

The 'Time stamp' is set to zero or the whole sync is omitted if located directly at the beginning of the sound. All time stamps should be sorted in chronological order. The sync can be considered as a validator of the subsequent string.

Newline characters are allowed in this frame and must be used after every entry (name, event etc.) when content type $03 - $04 is used.

A few considerations regarding whitespace characters: Whitespace separating words should mark the beginning of a new word, thus occurring in front of the first syllable of a new word. This is also valid for new line characters. A syllable followed by a comma should not be broken apart with a sync (both the syllable and the comma should be before the sync).

There may be more than one 'Synchronised Lyric/Text' frame in each tag, but only one with the same language and content descriptor.

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = SLT
  Frame Size = $00 00 6C
  Encoding = $01
  language = "eng"
  Time Stamp Format = $00
  Content Type = $01
  Content Descriptor = "Journey" $00 00
  Sync = "Strang"
  Sync Identifier = $00 00
  Time Stamp = $00 00 00 00
  Sync = "ers"
  Sync Identifier = $00 00
  Time Stamp = $00 00 00 25
  Sync = " in"
  Sync Identifier = $00 00
  Time Stamp = $00 00 00 89
  Sync = " the"
  Sync Identifier = $00 00
  Time Stamp = $00 00 00 95
  Sync = " night"
  Sync Identifier = $00 00
  Time Stamp = $00 00 00 A9
ID3v2.3 & ID3v2.4 Example:
  Frame ID = SYLT
  Frame Size = $00 00 00 45
  Frame Flags = $00 00
  Encoding = $00
  language = "eng"
  Time Stamp Format = $02
  Content Type = $01
  Content Descriptor = "wheels on the bus" $00
  Sync = "wheels on the bus"
  Sync Identifier = $00
  Time Stamp = $00 00 00 00
  Sync = "go round and round"
  Sync Identifier = $00
  Time Stamp = $00 00 00 25
Bytes:
3
3
1
3
1
1
18
14
2
4
8
2
4
8
2
4
10
2
4
14
2
4

4
4
2
1
3
1
1
8
7
1
4
8
1
4

Synchronised Tempo Codes

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
STC

ID3v2.2

SYTC

ID3v2.3

SYTC

ID3v2.4

For a more accurate description of the tempo of a musical piece, this frame might be used. After the header follows one byte describing which time stamp format should be used. Then follows one or more tempo codes. Each tempo code consists of one tempo part and one time part. The tempo is in BPM described with one or two bytes. If the first byte has the value $FF, one more byte follows, which is added to the first giving a range from 2 - 510 BPM, since $00 and $01 is reserved. $00 is used to describe a beat-free time period, which is not the same as a music-free time period. $01 is used to indicate one single beat-stroke followed by a beat-free period.

The tempo descriptor is followed by a time stamp. Every time the tempo in the music changes, a tempo descriptor may indicate this for the player. All tempo descriptors MUST be sorted in chronological order. The first beat-stroke in a time-period is at the same time as the beat description occurs. There may only be one "SYTC" frame in each tag.

The frames format is as follows:

Time stamp format = $xx

Tempo = [n bytes of encoded data]
Time stamp = $xx xx xx xx
* there may be one to many tempo codes

Where time stamp format is:

$01 = Absolute time, 32 bit sized, using MPEG frames as unit
$02 = Absolute time, 32 bit sized, using milliseconds as unit

Absolute time means that every stamp contains the time from the beginning of the file.

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = STC
  Frame Size = $00 00 11
  Time Stamp Format = $01
  Tempo = $7F
  Time Stamp = $00 00 00 00
  Tempo = $FF 03
  Time Stamp = $00 00 1F 40
  Tempo = $64
  Time Stamp = $00 00 3E 80
ID3v2.3 & ID3v2.4 Example:
  Frame ID = SYTC
  Frame Size = $00 00 00 11
  Frame Flags = $00 00
  Time Stamp Format = $02
  Tempo = $80
  Time Stamp = $00 00 00 00
  Tempo = $FF 02
  Time Stamp = $00 00 0F A0
  Tempo = $60
  Time Stamp = $00 00 13 88
Bytes:
3
3
1
1
4
2
4
1
4

4
4
2
1
1
4
2
4
1
4

Tagging Time

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TDTG

ID3v2.4

The 'Tagging time' frame contains a timestamp describing then the audio was tagged. Timestamp format is defined as yyyy-MM-ddTHH:mm:ss or a subset.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = TDTG
  Frame Size = $00 00 00 08
  Frame Flags = $00 00
  Encoding = $03
  Information = "1998-01"
Bytes:
4
4
2
1
7

Terms of Use

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

USER

ID3v2.3

USER

ID3v2.4

This frame contains a brief description of the terms of use and ownership of the file. More detailed information concerning the legal terms might be available through the Copyright/Legal Information frame. Newlines are allowed in the text. There may be more than one 'Terms of use' frame in a tag, but only one with the same 'Language'

The frames format is as follows:

Encoding = $xx
Language = $xx xx xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.3 & ID3v2.4 Example:
  Information = USER
  Frame Size = $00 00 00 0D
  Frame Flags = $00 00
  Encoding = $00
  Language = eng
  Information = "no license"
Bytes:
4
4
2
1
3
10

Time

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TIM

ID3v2.2

TIME

ID3v2.3

ID3v2.4

The 'Time' frame is a numeric string in the HHMM format containing the time for the recording. This field is always four characters long.

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TIM
  Frame Size = $00 00 05
  Encoding = $01
  Information = "0404"
ID3v2.3 & ID3v2.4 Example:
  Information = TIME
  Frame Size = $00 00 00 05
  Frame Flags = $00 00
  Encoding = $00
  Information = "0910"
Bytes:
3
3
1
4

4
4
2
1
4

Title Sort Order

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version

ID3v2.2

ID3v2.3

TSOT

ID3v2.4

The 'Title sort order' frame defines a string which should be used instead of the title (Title/Song Name/Content Description) for sorting purposes.

This frame is formated as:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.4 Example:
  Information = TSOT
  Frame Size = $00 00 00 06
  Frame Flags = $00 00
  Encoding = $03
  Information = "Clash"
Bytes:
4
4
2
1
5

Title/Song Name/Content Description

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TT2

ID3v2.2

TIT2

ID3v2.3

TIT2

ID3v2.4

The 'Title/Songname/Content description' frame is the actual name of the piece (e.g. "Adagio", "Hurricane Donna").

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TT2
  Frame Size = $00 00 0F
  Encoding = $01
  Information = "Adagio"
ID3v2.3 & ID3v2.4 Example:
  Information = TIT2
  Frame Size = $00 00 00 10
  Frame Flags = $00 00
  Encoding = $00
  Information = "Hurricane Donna"
Bytes:
3
3
1
14

4
4
2
1
15

Track Number/Position In Set

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TRK

ID3v2.2

TRCK

ID3v2.3

TRCK

ID3v2.4

The 'Track number/Position in set' frame is a numeric string containing the order number of the audio-file on its original recording. This may be extended with a "/" character and a numeric string containing the total number of tracks/elements on the original recording. E.g. "4/9".

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TRK
  Frame Size = $00 00 0F
  Encoding = $00
  Information = "1"
ID3v2.3 & ID3v2.4 Example:
  Information = TRCK
  Frame Size = $00 00 00 0B
  Frame Flags = $00 00
  Encoding = $01
  Information = "1/15"
Bytes:
3
3
1
1

4
4
2
1
10

Unique File Identifier

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
UFI

ID3v2.2

UFID

ID3v2.3

UFID

ID3v2.4

This frame's purpose is to be able to identify the audio file in a database, that may provide more information relevant to the content. Since standardisation of such a database is beyond this document, all UFID frames begin with an 'owner identifier' field. It is a null- terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific database implementation. Questions regarding the database should be sent to the indicated email address. The 'Owner identifier' must be non-empty (more than just a termination). The 'Owner identifier' is then followed by the actual identifier, which may be up to 64 bytes. There may be more than one of this frame type in a tag, but only one with the same 'Owner identifier'.

The frames format is as follows:

Owner identifier = [ISO-8859-1 encoded string] $00
Identifier = [up to 64 bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = UFI
  Frame Size = $00 00 23
  Owner identifier = "http://www.id3.org/dummy/ufid.html"
  Identifier = $00
ID3v2.3 & ID3v2.4 Example:
  Information = UFID
  Frame Size = $00 00 00 4C
  Frame Flags = $00 00
  Owner identifier = "example.com/db.html"
  Identifier = ...
Bytes:
3
3
34
1

4
4
2
19
57

Unsynchronised Lyric/Text Transcription

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
ULT

ID3v2.2

USLT

ID3v2.3

USLT

ID3v2.4

This frame contains the lyrics of the song or a text transcription of other vocal activities. The head includes an encoding descriptor and a content descriptor. The body consists of the actual text. The 'Content descriptor' is a terminated string. If no descriptor is entered, 'Content descriptor' is $00 (00) only. Newline characters are allowed in the text. There may be more than one 'Unsynchronised lyrics/text transcription' frame in each tag, but only one with the same language and content descriptor.

The frames format is as follows:

Encoding = $xx
Language = $xx xx xx
Content descriptor = [n bytes of encoded data] $00 (00)
Lyrics/Text = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = ULT
  Frame Size = $00 00 58
  Encoding = $01
  Language = eng
  Content Descriptor = "you suffer press 1" $00 00
  Lyrics/Text = "You suffer, but why?"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = USLT
  Frame Size = $00 00 05 16
  Frame Flags = $00 00
  Encoding = $01
  Language = jpn
  Content Descriptor = "オリジナルの歌詞" $00 00
  Lyrics/Text = "待ちぼうけさ" 00 0x0A
  Lyrics/Text cont. = "追い掛けても" 00 0x0A
  Lyrics/Text cont. = "遠ざかっていく日も見えない" 0x00 0A
  Lyrics/Text cont. = "あの声はどこから来て" 0x00 0A
  Lyrics/Text cont. = "どこへ消えていくのだろう、いつも" 0x00 0A
  Lyrics/Text cont. = "待ちぼうけさ" 0x00 0A
  Lyrics/Text cont. = "追い掛けても" 0x00 0A
  Lyrics/Text cont. = "遠ざかっていく日も見えない" 0x00 0A
  Lyrics/Text cont. = "あの声はどこから来て" 0x00 0A
  Lyrics/Text cont. = "どこへ消えていくのだろう、いつも" 0x00 0A
  Lyrics/Text cont. = "焦がれて" 0x00 0A
  Lyrics/Text cont. = "抱いたら" 0x00 0A
  Lyrics/Text cont. = "壊れてしまったよ" 0x00 0A
  Lyrics/Text cont. = "愛とかなしみに" 0x00 0A
  Lyrics/Text cont. = "焦がれてしまったよ" 0x00 0A
  Lyrics/Text cont. = "そこまでは遠いため" 0x00 0A
  Lyrics/Text cont. = "問いかける、あの日を" 0x00 0A
  Lyrics/Text cont. = "どこまでも続く、と" 0x00 0A
  Lyrics/Text cont. = "ここでまだ待ってる、と" 0x00 0A
  Lyrics/Text cont. = "あの声はどこから来て" 0x00 0A
  Lyrics/Text cont. = "どこへ消えていくのだろう、いつも" 0x00 0A
  Lyrics/Text cont. = "焦がれて" 0x00 0A
  Lyrics/Text cont. = "抱いたら" 0x00 0A
  Lyrics/Text cont. = "壊れてしまったよ" 0x00 0A
  Lyrics/Text cont. = "愛とかなしみに" 0x00 0A
  Lyrics/Text cont. = "焦がれてしまったよ" 0x00 0A
  Lyrics/Text cont. = "ひとり歩く、歩道はさびて" 0x00 0A
  Lyrics/Text cont. = "青い、濃い、橙色の日" 0x00 0A
  Lyrics/Text cont. = "居たい、きみの横、そっと" 0x00 0A
  Lyrics/Text cont. = "色、なくしても" 0x00 0A
  Lyrics/Text cont. = "焦がれて" 0x00 0A
  Lyrics/Text cont. = "抱いたら" 0x00 0A
  Lyrics/Text cont. = "壊れてしまったよ"
Bytes:
3
3
1
3
40
44

4
4
2
1
3
20
16
16
30
24
36
16
16
30
24
36
12
12
20
18
22
22
24
22
26
24
36
12
12
20
18
22
28
24
28
18
12
12
18

User Defined URL Link Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
WXX

ID3v2.2

WXXX

ID3v2.3

WXXX

ID3v2.4

This frame is intended for URL links concerning the audio file in a similar way to the other "W"-frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual URL. The URL is always encoded with ISO-8859-1 . There may be more than one 'User Defined URL Link' frame in each tag, but only one with the same description.

The frames format is as follows:

Encoding = $xx
Description = [n bytes of encoded data] $00 (00)
URL = [ISO-8859-1 encoded string]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = WXX
  Frame Size = $00 00 29
  Encoding = $00
  Description = "calculator" $00
  URL = "https://www.rapidtables.com"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = WXXX
  Frame Size = $00 00 00 2D
  Frame Flags = $00 00
  Encoding = $00
  Description = "music map output" $00
  URL = "https://www.music-map.com/"
Bytes:
3
3
1
11
27

4
4
2
1
17
26

User Defined Text Information Frame

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TXX

ID3v2.2

TXXX

ID3v2.3

TXXX

ID3v2.4

This frame is intended for one-string text information concerning the audio file in a similar way to the other "T"-frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual string. There may be more than one 'user defined text information' frame in each tag, but only one with the same description

The frames format is as follows:

Encoding = $xx
Description = [n bytes of encoded data] $00 (00)
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TXX
  Frame Size = $00 00 12
  Encoding = $00
  Description = "found on" $00
  Information = "05052001"
ID3v2.3 & ID3v2.4 Example:
  Frame ID = TXXX
  Frame Size = $00 00 00 17
  Frame Flags = $00 00
  Encoding = $00
  Description = "realted artist" $00
  Information = "Alvvays" $00
Bytes:
3
3
1
9
8

4
4
2
1
15
7

Year

ID3v2.2 ID3v2.3 ID3v2.4
Frame ID
Version
TYE

ID3v2.2

TYRE

ID3v2.3

ID3v2.4

The 'Year' frame is a numeric string with a year of the recording. This frames is always four characters long (until the year 10000).

The frames format is as follows:

Encoding = $xx
Information = [n bytes of encoded data]

See below for an example of what this frame could look like:

ID3v2.2 Example:
  Frame ID = TYE
  Frame Size = $00 00 05
  Encoding = $00
  Information = "2014"
ID3v2.3 & ID3v2.4 Example:
  Information = TYER
  Frame Size = $00 00 00 05
  Frame Flags = $00 00
  Encoding = $00
  Information = "1980"
Bytes:
3
3
1
4

4
4
2
1
4

Genres

001   Classic Rock
002   Country
003   Dance
004   Disco
005   Funk
006   Grunge
007   Hip-Hop
008   Jazz
009   Metal
010   New Age
011   Oldies
012   Other
013   Pop
014   Rhythm and Blues
015   Rap
016   Reggae
017   Rock
018   Techno
019   Industrial
020   Alternative
021   Ska
022   Death Metal
023   Pranks
024   Soundtrack
025   Euro-techno
026   Ambient
027   Trip-hop
028   Vocal
029   Jazz & Funk
030   Fusion
031   Trance
032   Classical
033   Instrumental
034   Acid
035   House
036   Game
037   Sounc Clip
038   Gospel
039   Noise
040   Alternative Rock
041   Bass
042   Soul
043   Punk
044   Space
045   Meditative
046   Instrumental Pop
047   Instrumental Rock
048   Ethnic
049   Gothic
050   Darkwave
051   Techno-industrial
052   Electronic
053   Pop-folk
054   Eurodance
055   Dream
056   Southern Rock
057   Comedy
058   Cult
059   Gangsta
060   Top 40
061   Christian Rap
062   Pop/Funk
063   Jungle Music
064   Native US
065   Cabaret
066   New Wave
067   Psychedelic
068   Rave
069   Showtunes
070   Trailer
071   Lo-fi
072   Tribal
073   Acid Punk
074   Acid Jazz
075   Polka
076   Retro
077   Musical
078   Rock n Roll
079   Hard Rock
080   Folk
081   Folk Rock
082   National Folk
083   Swing
084   Fast Fusion
085   Bebop
086   Latin
087   Revival
088   Celtic
089   Bluegrass
090   Avantgarde
091   Gothic Rock
092   Progressive Rock
093   Psychedelic Rock
094   Symphonic Rock
095   Slow Rock
096   Big Band
097   Chorus
098   Easy Listening
099   Acoustic
100   Humour
101   Speech
102   Chanson
103   Opera
104   Chamber Music
105   Sonata
106   Symphony
107   Booty Bass
108   Primus
109   Porn Groove
110   Satire
111   Slow Jam
112   Club
113   Tango
114   Samba
115   Folklore
116   Ballad
117   Power Ballad
118   Rhythmic Soul
119   Freestyle
120   Duet
121   Punk Rock
122   Drum Solo
123   A Cappella
124   Euro-house
125   Dance Hall
126   Goa Music
127   Drum & Bass
128   Club House
129   Hardcore Techno
130   Terror
131   Indie
132   Britpop
133   Negerpunk
134   Polsk Punk
135   Beat
136   Christain Gangsta Rap
137   Heavy Metal
138   Black Metal
139   Crossover
140   Contemporary Christian
141   Christian Rock
142   Merengue
143   Salsa
144   Thrash Metal
145   Anime
146   JPop
147   Synthpop
148   Christmas
149   Art Rock
150   Baroque
151   Bhangra
152   Big Beat
153   Breakbeat
154   Chillout
155   Downtempo
156   Dub
157   EBM
158   Eclectic
159   Electro
160   Electroclash
161   Emo
162   Experimental
163   Garbage
164   Global
165   IDM
166   Illbient
167   Industro-Goth
168   Jam Band
169   Krautrock
170   Leftfield
171   Lounge
172   Math Rock
173   New Romantic
174   Nu-breakz
175   Post-punk
176   Post-rock
177   Psytrance
178   Shoegaze
179   Space Rock
180   Trop Rock
181   World Music
182   Neoclassical
183   Audiobook
184   Audio Theatre
185   Neue Deutsche Welle
186   Podcast
187   Indie-rock
188   G-Funk
189   Dubstep
190   Garage Rock
191   Psybient

Unsynchronisation

Whenever a false synchronisation is found within the tag, one zeroed byte is inserted after the first false synchronisation byte. The format of synchronisations that should be altered by ID3 encoders is as follows:

 %11111111 111xxxxx

and should be replaced with:

 %11111111 00000000 111xxxxx

This has the side effect that all $FF 00 combinations have to be altered, so they will not be affected by the decoding process. Therefore all the $FF 00 combinations have to be replaced with the $FF 00 00 combination during the unsynchronisation.

To indicate usage of the unsynchronisation, the unsynchronisation flag in the frame header should be set. This bit must be set if the frame was altered by the unsynchronisation and should not be set if unaltered. If all frames in the tag are unsynchronised the unsynchronisation flag in the tag header should be set. It must not be set if the tag has a frame which is not unsynchronised.

Assume the first byte of the audio to be $FF. The special case when the last byte of the last frame is $FF and no padding nor footer is used will then introduce a false synchronisation. This can be solved by adding a footer, adding padding or unsynchronising the frame and add $00 to the end of the frame data, thus adding more byte to the frame size than a normal unsynchronisation would. Although not preferred, it is allowed to apply the last method on all frames ending with $FF.

It is preferred that the tag is either completely unsynchronised or not unsynchronised at all. A completely unsynchronised tag has no false synchonisations in it, as defined above, and does not end with $FF. A completely non-unsynchronised tag contains no unsynchronised frames, and thus the unsynchronisation flag in the header is cleared.

Do bear in mind, that if compression or encryption is used, the unsynchronisation scheme must be applied afterwards. When decoding an unsynchronised frame, the unsynchronisation scheme must be reversed first, encryption and decompression afterwards.

Synchsafe Integers

In some parts of the tag it is inconvenient to use the unsychronisation scheme because the size of unsynchronised data is not known in advance, which is particularly problematic with size descriptors. The solution in ID3v2 is to use synchsafe integers, in which there can never be any false synchs. Synchsafe integers are integers that keep its highest bit (bit 7) zeroed, making seven bits out of eight available. Thus a 32 bit synchsafe integer can store 28 bits of information.

Example:
  255 (%11111111) encoded as a 16 bit synchsafe integer is 383 (%00000001 01111111).

Padding

It is permitted to include padding after the final frame (at the end of the ID3 tag), making the size of all the frames together smaller than the size given in the head of the tag however, this is only supported in version 3 and 4. A possible purpose of this padding is to allow for adding a few additional frames or enlarge existing frames within the tag without having to rewrite the entire file. The value of the padding bytes must be $00.