This page hosts a formal specification of ID3v2.3 tag for .mp3 files using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
meta:
id: id3v2_3
title: ID3v2.3 tag for .mp3 files
file-extension: mp3
xref:
forensicswiki: id3
justsolve: ID3
loc: fdd000108 # ID3v2
wikidata: Q1054220
license: CC0-1.0
endian: be
doc-ref: https://id3.org/id3v2.3.0
seq:
- id: tag
type: tag
types:
tag:
doc-ref: Section 3. ID3v2 overview
seq:
- id: header
type: header
- id: header_ex
type: header_ex
if: header.flags.flag_headerex
- id: frames
type: frame
repeat: until
repeat-until: _io.pos + _.size > header.size.value or _.is_invalid
- id: padding
if: header.flags.flag_headerex
size: header_ex.padding_size - _io.pos
header:
doc: ID3v2 fixed header
doc-ref: Section 3.1. ID3v2 header
seq:
- id: magic
contents: 'ID3'
- id: version_major
type: u1
- id: version_revision
type: u1
- id: flags
type: flags
- id: size
type: u4be_synchsafe
types:
flags:
seq:
- id: flag_unsynchronization
type: b1
- id: flag_headerex
type: b1
- id: flag_experimental
type: b1
- id: reserved
type: b5
header_ex:
doc: ID3v2 extended header
doc-ref: Section 3.2. ID3v2 extended header
seq:
- id: size
type: u4
- id: flags_ex
type: flags_ex
- id: padding_size
type: u4
- id: crc
type: u4
if: flags_ex.flag_crc
types:
flags_ex:
seq:
- id: flag_crc
type: b1
- id: reserved
type: b15
frame:
doc-ref: Section 3.3. ID3v2 frame overview
seq:
- id: id
type: str
size: 4
encoding: ASCII
- id: size
type: u4
- id: flags
type: flags
- id: data
size: size
instances:
is_invalid:
value: "id == '\x00\x00\x00\x00'"
types:
flags:
seq:
- id: flag_discard_alter_tag
type: b1
- id: flag_discard_alter_file
type: b1
- id: flag_read_only
type: b1
- id: reserved1
type: b5
- id: flag_compressed
type: b1
- id: flag_encrypted
type: b1
- id: flag_grouping
type: b1
- id: reserved2
type: b5
# Section 6.2. Synchsafe integers
u1be_synchsafe:
seq:
- id: padding
type: b1
- id: value
type: b7
u2be_synchsafe:
seq:
- id: byte0
type: u1be_synchsafe
- id: byte1
type: u1be_synchsafe
instances:
value:
value: (byte0.value << 7) | byte1.value
u4be_synchsafe:
seq:
- id: short0
type: u2be_synchsafe
- id: short1
type: u2be_synchsafe
instances:
value:
value: (short0.value << 14) | short1.value