LazyTools

🔒 Every tool runs in your browser — the files and values you enter are never uploaded to any server. How it works

explainer

ID3 Tags Explained: How MP3 Metadata Actually Works

By the LazyTools team · Published 2026-08-03 · Updated 2026-08-23 · 7 min read

An MP3 file showing an ID3v2 tag at the start and an ID3v1 tag at the end, with title, artist and album frames

When your music player shows “Bohemian Rhapsody — Queen — A Night at the Opera,” it isn’t reading the filename — it’s reading ID3 tags embedded inside the MP3. These are blocks of metadata baked into the file itself, and understanding how they work explains why tags sometimes go missing, show garbled text, or disagree between apps. Here’s the full breakdown, plus how to read any file’s tags with the MP3 Tag Reader.

Diagram of an MP3 file showing an ID3v2 tag at the start, MPEG audio frames in the middle, and a 128-byte ID3v1 tag at the end. A panel lists common ID3v2 frames such as TIT2 for title, TPE1 for artist, TALB for album and APIC for cover art. Another panel shows how the encoding byte 03 marks text as UTF-8 so the bytes decode to Cafe with an accent, while a reader that wrongly assumes Latin-1 produces garbled mojibake.
How ID3v2 and ID3v1 tags wrap the audio, the main ID3v2 frames, and why the encoding byte decides whether text reads correctly or turns into mojibake.

What ID3 tags are

An MP3 file is mostly compressed audio frames, but it also carries metadata describing the track: title, artist, album, year, genre, track number, cover art and more. That metadata is stored in ID3 tags (the name comes from “IDentify an MP3”). Without them, your library would be a wall of filenames. There are two generations of the format, and a single file often carries both at once — ID3v2 at the front and ID3v1 at the back — which is exactly why two apps can occasionally show slightly different details for the same song.

ID3v1: the 128-byte relic

The original ID3v1 is dead simple: a fixed 128-byte block at the very end of the file, starting with the letters TAG. It has fixed-size slots and nothing more:

FieldSize
”TAG” marker3 bytes
Title30 bytes
Artist30 bytes
Album30 bytes
Year4 bytes
Comment30 bytes
Genre1 byte (a number into a fixed list)

Its limits are obvious: titles longer than 30 characters get truncated, there’s no Unicode, no cover art, and the genre is just a number into a predefined list (17 = Rock, 13 = Pop…). A later tweak, ID3v1.1, stole the last two bytes of the comment field to squeeze in a track number, which is why some old files show a track and others don’t. The whole format survives today only as a fallback for software too old to understand ID3v2.

ID3v2: the modern format

ID3v2 is what essentially everything writes today. It sits at the start of the file (so players read it without scanning the whole thing) and is built from frames — each a four-character ID plus a length and its data. A handful of frames cover almost everything you see in a player:

Frame IDHolds
TIT2Title
TPE1Lead artist / performer
TALBAlbum
TCONGenre
TRCKTrack number
TYER / TDRCYear / recording date
TCOMComposer
COMMComment
APICAttached picture (cover art)

Because the format is frame-based it is extensible: a reader that meets a frame ID it doesn’t recognise simply skips it using the declared length, so new frame types never break old software. It supports long Unicode text and can embed a full-resolution album cover right in the file. Versions 2.3 and 2.4 are the common ones in the wild. The main practical difference: 2.4 stores every frame size as a “synchsafe” integer (seven usable bits per byte) so tag bytes can never be mistaken for an MPEG audio sync signal, and it adds UTF-8 as a text option. Note that the year moved from the TYER frame in 2.3 to the combined TDRC date frame in 2.4 — a common reason a “year” field looks empty after a version change.

Why tags sometimes look garbled

Each ID3v2 text frame begins with an encoding byte that declares how the following text is stored:

ByteEncodingAvailable in
0Latin-1 (ISO-8859-1)2.3 and 2.4
1UTF-16 with BOM2.3 and 2.4
2UTF-16 big-endian2.4 only
3UTF-82.4 only

If a player ignores that byte and just guesses an encoding, non-Latin or accented text becomes mojibake — the classic example is “Café” turning into “Café” when UTF-8 bytes are misread as Latin-1. Cyrillic, Greek, Japanese and Chinese titles suffer the worst, sometimes collapsing into rows of question marks. A reader that honours the declared encoding byte shows the text exactly as it was written. This mismatch is the single most common cause of “weird characters” in music libraries, and it is why the same file can look fine in one app and broken in another.

A worked example

Say a track’s title frame holds the bytes 03 43 61 66 C3 A9. The first byte, 03, declares UTF-8. The remaining bytes 43 61 66 C3 A9 decode as C, a, f, and then the two-byte UTF-8 sequence C3 A9, which is é — giving the correct Café. A naive reader that assumed Latin-1 would treat C3 and A9 as two separate characters (à and ©) and display Café. Same bytes, different assumption, and only one of them respects what the file actually said.

Bitrate and sample rate live elsewhere

One thing ID3 tags don’t store is the audio spec. The bitrate, sample rate, MPEG version, layer and channel mode come from the MPEG audio frame header — a 4-byte header that begins every audio frame, starting with a run of “sync” bits. Read the first frame header and you know how the audio was encoded.

For variable-bitrate (VBR) files the average bitrate alone would give a wrong duration, so encoders write a small Xing (or Info, for constant-bitrate) header inside the first frame recording the total frame count and often the total byte size. Multiplying the frame count by the samples-per-frame and dividing by the sample rate yields an exact duration instead of a guess. That is why a good reader can show, say, 4:33 precisely rather than an estimate that drifts by several seconds on a VBR file.

Reading vs editing: nothing touches the audio

It is worth stressing that tags and audio are separate regions of the file. Reading a tag just parses those metadata bytes. Even editing a tag only rewrites the metadata block — the compressed audio frames are never decoded or re-encoded, so there is no generation loss and no change in sound quality. The only thing that shifts is where the audio starts, because a larger ID3v2 tag pushes it slightly later in the file. (Many encoders leave padding after the tag precisely so small edits don’t require rewriting the whole file.)

Read a track’s tags privately

Because all of this is embedded in the file, you can read it without any server round-trip. The MP3 Tag Reader parses the ID3v2 and ID3v1 tags and the MPEG frame header entirely in your browser: drop in an .mp3 and it shows the title, artist, album, genre, year and track — decoded in the correct character set, so no mojibake — plus the bitrate, sample rate, channel mode and duration read straight from the frame header. The file never leaves your device. It reads tags; it doesn’t change them, so it’s a safe way to inspect a library and diagnose exactly why a stubborn track displays the way it does.

Frequently asked questions

What are ID3 tags?

ID3 tags are blocks of metadata embedded inside an MP3 file that store information about the track — title, artist, album, year, genre, track number, cover art and more. They're what your music player reads to display a song's details instead of just the filename. There are two generations: the older ID3v1 and the modern ID3v2.

What's the difference between ID3v1 and ID3v2?

ID3v1 is a fixed 128-byte block at the very end of the file with room for only short title, artist, album, year, comment and a single genre number. ID3v2 sits at the start of the file, is extensible, supports long Unicode text, many frame types and embedded cover art, and is what modern software writes. Many files contain both; players prefer ID3v2.

Why do some MP3 tags show garbled or weird characters?

Because ID3 text can be stored in several character encodings — Latin-1, UTF-16 or UTF-8 — and each text frame declares which one it uses. If a player assumes the wrong encoding, accented or non-Latin characters turn into mojibake (garbled symbols). A reader that respects the declared encoding byte shows the text correctly.

Where in the file are ID3 tags stored?

ID3v2 is at the very beginning of the file, before the audio, so players can read metadata without scanning the whole file. ID3v1, when present, is the last 128 bytes of the file, starting with the letters 'TAG'. The MP3 audio frames sit in between.

Can I read an MP3's bitrate and sample rate from the file?

Yes. Those come from the MPEG audio frame header, not the ID3 tag. The first frame header encodes the MPEG version, layer, bitrate, sample rate and channel mode. For variable-bitrate files, a Xing/Info header near the start stores the frame count so the exact duration can be computed.

Does editing ID3 tags change the audio?

No. Tags are metadata stored alongside the audio frames; changing a title or artist doesn't touch the compressed audio, so there's no quality loss and no re-encoding. Reading tags — as this tool does — never modifies the file at all.