MyID3: a Java ID3 Tag Library.
By Charles M. Chen,
Mp3 files encode their metadata (artist, song title, etc.) in ID3 tags.
Note: ID3v1 and ID3v2 are seperate tags formats.
This tag format is well documented at the site for the open source c/c++ id3lib library, which I strongly recommend over any other tag library.
MyID3 is a pure-Java library that can read & write ID3v1 and ID3v2 tags.
Although not yet version 1.0, MyID3 is working. I've tested it with a wide variety of mp3s.
It is Open Source; free as in freedom and free as in beer.
Full support for .m4a/.aac/.mpa files coming soon.
News: A MyID3 user has ported the previous version of the library to Android. Thanks, 砂井裏鍵(aka Romulus 仲明) !
Version 0.83 released December 3rd, 2008.
Binary: myid3.jar
Source distribution includes binary, source and this document. This project has three dependencies:
  • Jakarta Regexp, and (tested up to version 5.2). Jakarta Regexp is available under the same license as MyID3: the ASF (Apache) License.
  • Nanoxml, a lightweight XML parsing library. (tested up to version 5.2). Nanoxml is available under the zlib/libpng License. Note: Nanoxml is only neccesary if you use the included GUI test tool.
  • I've recently open sourced the last dependency of this project, sharedlib.
MyID3 exposes two apis: a simplified interface, and a "raw" interface.
The Simple Interface hides the differences between the ID3v1 and ID3v2.
It maps values from both tags into a MusicMetadata object which has typed accessor methods for the following fields: Album, Artist, Comment, Compilation, Composer, Composer2, DurationSeconds, Genre, Producer, ProducerArtist, SongTitle, Year.

File src = ?;
MusicMetadataSet src_set = new MyID3().read(src); // read metadata

if (src_set == null) // perhaps no metadata
Debug.debug("src_set", src_set); // dump all info.
Debug.debug("src_set", src_set.getArtist()); 

MusicMetadata metadata = src_set.getSimplified();
String artist = metadata.getArtist();  
String album = metadata.getAlbum();  
String song_title = metadata.getSongTitle(); 
Number track_number = metadata.getTrackNumber(); 

metadata.setArtist("Bob Marley");

File dst = ...
new MyID3().write(src, dst, src_set, metadata);  // write updated metadata

The Raw Interface exposes the differences between the ID3v1 and ID3v2, every frame, as well as the underlying bytes, etc.

File src = ?;
MusicMetadataSet src_set = new MyID3().read(src); // read metadata
String id3v1_artist = src_set.id3_v1_raw.values.getArtist();
String id3v2_artist = src_set.id3_v2_raw.values.getArtist();

byte id3v1_tag_bytes[] = src_set.id3_v1_raw.bytes; // tag bytes
byte id3v2_tag_bytes[] = src_set.id3_v2_raw.bytes; // tag bytes

Vector id3v2_frames = src_set.id3_v2_raw.frames; // 
if (id3v2_frames.size() > 1)
	MyID3v2Frame first_frame = (MyID3v2Frame) id3v2_frames
	String frame_frame_id = first_frame.frame_id;
	byte frame_frame_bytes[] = first_frame.data_bytes;
Version 0.83 released December 3rd, 2008
  1. Improved the project and package structure.
  2. Improved error handling throughout library.
  3. Added many unit tests.
  4. Fixed a bug around malformed UTF-16 text values.
  5. Complete rewrite of id3v2 frame-to-metadata mapping. Added support for many more frames (types of id3v2 metadata). Improved support for semi-numeric types like year, track number, etc.
  6. Fixed long standing issue around year metadata.
  7. Added strict (don't ignore warnings & errors) mode.
  8. Removed the dependency on sharedlib. Library now has only two dependencies, Apache Jakarta Regexp and JUnit. JUnit is only necessary for running the unit test suite.
Version 0.82 released July 22nd, 2008.
  1. Windows Media Player chokes on string encoded in big-endian UTF-16. I've switched to using little-endian.
  2. Slightly improved Genre handling.
  3. Rolled up a number of small changes and code cleanup.
Version 0.81 released November 18th, 2007.
  1. Added Javadocs to source distribution. I need to add javadocs for the primary public classes, but... it is a start.
  2. Add support for PIC/APIC. MusicMetadata now has getPictureList(), etc. methods. PIC images are now preserved when upgrading ID32 tags from version 2 to 3 or 4.
Version 0.80 released October 6th, 2007.
  1. Fixed subtle issues around Unicode handling. Removed dependency on nio to parse unicode.
Version 0.79 released August 19th, 2007.
  1. Fixed a series of major bugs involving differences between ID3 version 2.3.0 and 2.4.0 tag and frame flags.
  2. Remove a great deal of old cruft.
  3. Fixed bugs around handling of UTF-8 text frames.
  4. Reorganized the package structure of the project.
Version 0.78 released June 17th, 2007.
  1. I've open sourced the last dependency of this project, sharedlib.
Version 0.77 released December 8th, 2006, fixing two encoding bugs.
  1. Now writes ID3v2 tags in ID3v2.3.0 rather than ID3v2.4.0 as WinAmp and iTunes weren't reading version 2.4.0 tags properly.
  2. I've changed the frame order so that text frames always appear first.
  3. I've added the MyID3Listener interface which makes debugging & extending the code easier.
Version 0.76 released September 16th, 2006, fixing a text encoding bug.
Version 0.75 released September 2nd, 2006.

To do list:
  • Improve support for embeded images (PIC/APIC).
  • m4a support.
  • Make "cleaning up" of metadata optional.
  • Better handling of non-numeric track numbers.
  • Finer-grained error handling.
  • Complete refactor of music metadata unification, metadata cleanup and & binary frame handling.
  • Remove all error logging to console.
  • Fix all code labeled with TODO comment.
  • Add strict (don't ignore warnings & errors) mode.
  • Remove external dependencies, starting with jakarta regexp.
I strongly recommend id3lib. It's fast, open source, and well-maintained. It is written in c/c++.
Javazoom's JLayer & JLayerME. This Java library decodes MP3 audio as well. Include a J2ME edition.
Eric Farng's Java ID3 Tag Library.
Paul Grebenc's JID3.
Florian Heer's ID3 aka mp3info aka ueberdosis.
Jens Vonderheide's Java Library MP3.
I'm sure there are others as well.
This text is available under the ASF (Apache) License.
This is a non-viral Open Source license.