Read MP3 Tag Information (ID3v1 and ID3v2)

I started this because I was writing a media player in C# and I couldn't find any good libraries that could handle ID3v2. So I wrote one.  It can handle:

ID3v1 (and 1.1)

This reads all v1 and v1.1 tags. The only difference between these two is the last byte of the v1 comment field has been hijacked for track number in v1.1. It also has write ID3v1 code but hasn't been really tested.  Use at your own risk.

ID3v2 (2.2, 2.3, 2.4)

Reads all header info and creates a hash indexed by key and an array of frames. Parses some of the more common frames for Title, Artist, etc...  All frames are available w/ contents held in a byte array for user parsing. 

MPEG Header Info

Finds and reads mpeg header information. 

References, Acknowledgements and Thanks

  • the specs from
  • Many Thanx to James Heinrich of SiliSoftware. I used his code as an example in a few places and he was very helpful to me on the mailing list
  • Ralf for his coding ponters.
  • I got my MPEG Header info from this great site.

Source Code

The way I ended up writing this was in a couple classes.  Yes it could be more elegant but I haven't been doing any real programming in a long time.  Maybe I will massage it into some nicer form in the future.  Anyway, here are the classes:

  • mp3info.cs is the wrapper class. It contains the objects for the MPEG headers, id3v1 and v2 and some song length calculation code
  • MPEG.cs contains the code to find and read the MPEG headers.
  • ID3v1.cs contains the code to read and (possibly) write the id3v1 tags.
  • ID3v2.cs contains the code to read id3v2.2 - 2.4 tags. Some of the tags it parses into Title, Artist, Etc... the rest are stored in an array (in order read for later writing), and a hash (keyed by frame name)
  • BitReader.cs With all the flags and what not I had to deal w/ I ended up writing a class to convert a byte into an array of chars or bools representing the bits. this should be useful outside of this project.
  • id3v2Frame.cs A subclass of id3v2 frames. contains the size, flags, name, and contents of a frame.

To Do (incomplete List):

  • MPEG: length in seconds may be off b/c I don't take into account the presence of id3v1
  • MPEG: no VBR Calc
  • ALL: no error handling
  • ALL: this could be done w/ inheritance if I wanted to get fancy
  • v1: haven't tested update
  • v2: must write update code
  • v2: must write parsing code
  • write better webpage
  • write some usage docs
  • set up versioning

You might also like...


Erin Jones


Why not write for us? Or you could submit an event or a user group in your area. Alternatively just tell us what you think!

Our tools

We've got automatic conversion tools to convert C# to VB.NET, VB.NET to C#. Also you can compress javascript and compress css and generate sql connection strings.

“Brevity is the soul of wit” - Shakespeare