ID3

ID3, or ID3 tag, is a metadata format, mainly used in MP3 audio files. It stores information such as the song title, artist, and album.

Although designed for use with (and named after) MP3, ID3 is sometimes used with other audio formats. This can be done in two fundamental ways:
 * Embedding the ID3 data inside the file, in a manner appropriate for that audio format. For example, here is a WMA file containing ID3 data.
 * Prepending and/or appending the ID3 data to the file, MP3-style. This practice is not necessarily approved by any standard, but it has been done, for example with Ogg and FLAC. Here, the tail is wagging the dog, and ID3 can be thought of as a container format for an arbitrary audio format.

Format details
There are two major versions. ID3v1 defines a fixed-length data block that is always placed at the end of the file. ID3v2, which has very little in common with ID3v1, defines a block with variable-length frames and allows more flexibility and verbosity. ID3v2 data usually appears at the beginning of the file. It is possible, and common, for a file to have both ID3v1 and ID3v2 metadata.

As of 2017, there are three versions of ID3v2 to be aware of: v2.2.x, v2.3.x, and v2.4.x. These formats have some critical differences, and are definitely not compatible with each other.

Identification
For an MP3 file with an ID3v1 tag, ASCII "" appears beginning 128 bytes from the end of the file.

An MP3 file with an ID3v2 tag usually begins with ASCII "".

Alternatively, the signature "" could appear 10 bytes from the end of the file, or 138 bytes from the end of the file if there is also an ID3v1 tag. This is much less likely.

There are other (rare) ways to use ID3v2, not covered by the above identification logic.

How to skip past an ID3v2 segment
To identify an audio file's format, it is best to skip past any ID3v2 segment at the beginning of the file before looking for a magic signature, and not just assume that ID3 implies MP3. Unfortunately, doing so is not trivial. Here is an attempt to summarize the algorithm: OFFSET is now the file offset of the payload audio data.
 * Let OFFSET = 0.
 * Read and remember the first 10 bytes of the file.
 * If bytes 0-2 are not ASCII "ID3", stop. An ID3v2 segment is not present.
 * Let OFFSET = 10 (for the 10-byte header).
 * Decode bytes 6-9 as a 32-bit "synchsafe int" (refer to any ID3v2 spec). Let OFFSET = OFFSET + this decoded int.
 * If the 0x10 bit of byte 5 is set, let OFFSET = OFFSET + 10 (for the footer).

Specifications

 * ID3.org Developer Information
 * ID3v1
 * ID3v2.2.0
 * ID3v2.3.0: Plain text · HTML
 * ID3v2.4.0: Main Structure · Native Frames
 * ID3 tag version 2 (Another copy of v2.2.0)
 * MPEG Audio Tag ID3v1
 * Hydrogenaudio Knowledgebase: ID3v1
 * Hydrogenaudio Knowledgebase: ID3v1.1
 * Hydrogenaudio Knowledgebase: ID3v2

Software

 * id3lib
 * TagLib
 * Metadata++

''[Ed. note: There are many utilities that can read and write ID3 tags, including Windows Explorer to some extent. We suggest searching the web.]''

Resources

 * ID3.org
 * Wikipedia article
 * Coding Horror: A Spec-tacular Failure
 * What ID3v2 could have been