Recently some users of Audacity have noted that when they save ID3v2 tags, most programs do not seem to recognize them. One user specifically tried WinAmp 3, CDEx 1.5, Windows Media Player 6.4, and WMP 7.01. None of them recognized any ID3v2 tags from an MP3 file output by Audacity (which uses libid3tag).
ID3v1 tags work fine by all of those programs.
I tried the same experiment. I tried saving some MP3 files using the last version of Audacity (which uses libid3tag 0.14.2b) and also a recompiled version using libid3tag 0.15.0b. First of all, ID3v1 tags always worked fine.
When I opened the ID3v2-tagged files using Audacity, all of the tags loaded properly. So clearly the tags are being written, and libid3tag is able to open them.
iTunes also opens them and parses all of the tags correctly on my Mac.
However, I downloaded a few id3lib-based programs for Linux, and none of these were able to parse the ID3v2 files. Not a single tag. XMMS also failed, but I'm not sure it's supposed to have ID3v2 support.
I don't use Windows anymore, so I can't repeat the experiment with Windows Media Player or Winamp.
If anyone's interested in the Audacity part of the code, here's a pointer:
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/audacity/audacity-src/src/Tag...
So...
1. Anyone have similar experiences? What level of support does most other software have for ID3v2 tags?
2. Are there any free programs out there you know of that write ID3v2 tags using libid3tag? It would be nice to see if they have the same behavior. It's possible that the bug is in Audacity.
3. Any plans to support writing older, but more compatible, versions of ID3 tags for better compatibility with other programs?
Thanks, Dominic
On Tuesday, September 2, 2003, at 11:13 PM, Dominic Mazzoni wrote:
...
It would seem most other software does not yet have support for ID3v2.4.
A few that I'm aware of:
- MusicBrainz TunePimp library, used in the MB Tagger http://musicbrainz.org/tagger/index.html
- xmms-mad, plugin for xmms http://xmms-mad.sourceforge.net/
Not currently. Although ID3 is fairly miserable in its lack of forward compatibility, the decision to write ID3v2.4 tags exclusively was intended to encourage its adoption and to simplify the implementation and programmer view.
Fortunately it may not be very difficult to modify libid3tag to support writing tags in multiple version formats. It will require some additional translations, but seems possible. I suppose it may happen if there is enough demand for it.
Cheers,
Rob Leslie wrote:
Luckily ID3v2.3 is quite similar to ID3v2.4, so I tried patching libid3tag to output ID3v2.3 tags as an option. I think I took care of the main differences, but there are a small number of specific tags that changed between the versions, and I didn't handle those differences. I'm using this in Audacity, though, and it seem to be pretty successful - the ID3v2.3 tags it outputs seem to be supported by many more programs.
Patch attached. I don't really expect you to check this in, since it makes it possible to output bad tags if you're not careful, but maybe someone else on the list will be interested in this as a workaround, too, or maybe it will save you some time later if you decide there's more demand.
Cheers, Dominic
diff -r libid3tag-0.15.0b/frame.c libid3tag-0.15.0b-patch/frame.c 542,543c542,547 < if (size_ptr) < id3_render_syncsafe(&size_ptr, size - 10, 4); ---
560c564 < if (flags & ID3_FRAME_FLAG_GROUPINGIDENTITY) ---
if (flags & ID3_FRAME_FLAG_GROUPINGIDENTITY) {
562c566,568 < if (flags & ID3_FRAME_FLAG_ENCRYPTION) ---
}
if (flags & ID3_FRAME_FLAG_ENCRYPTION) {
563a570,571
}
620,621c628,633 < if (size_ptr) < id3_render_syncsafe(&size_ptr, size - 10, 4); ---
diff -r libid3tag-0.15.0b/id3tag.h libid3tag-0.15.0b-patch/id3tag.h 142c142,143 < ID3_TAG_OPTION_ID3V1 = 0x0100 /* render ID3v1/ID3v1.1 tag */ ---
ID3_TAG_OPTION_ID3V1 = 0x0100,/* render ID3v1/ID3v1.1 tag */ ID3_TAG_OPTION_ID3V2_3 = 0x0200 /* render ID3v2.3 tag */
diff -r libid3tag-0.15.0b/tag.c libid3tag-0.15.0b-patch/tag.c 764a765,913
780a930,932
if (tag->options & ID3_TAG_OPTION_ID3V2_3) return v2_3_render(tag, buffer);
852c1004 < crc_ptr = *ptr; ---
crc_ptr = *ptr;