以编程方式更改id3标记版本(pref java)
我需要一种方法,以编程方式将mp3文件的id3标签版本更改为一些id3v2.x,最好使用java,尽管任何有效的方法总比没有好。如果它转换现有标记以使现有数据不被破坏,而不是完全创建新标记,则会获得额外的积分 编辑:Jaudiotager工作了,谢谢。遗憾的是,我不得不将其限制为mp3文件,并且只保存以前标签中包含的数据(如果它们是id3)。我决定将标记转换为ID3v2.3,因为windows资源管理器无法处理v2.4,这有点棘手,因为程序对是使用复制构造函数还是转换构造函数有点困惑以编程方式更改id3标记版本(pref java),java,mp3,id3,id3v2,Java,Mp3,Id3,Id3v2,我需要一种方法,以编程方式将mp3文件的id3标签版本更改为一些id3v2.x,最好使用java,尽管任何有效的方法总比没有好。如果它转换现有标记以使现有数据不被破坏,而不是完全创建新标记,则会获得额外的积分 编辑:Jaudiotager工作了,谢谢。遗憾的是,我不得不将其限制为mp3文件,并且只保存以前标签中包含的数据(如果它们是id3)。我决定将标记转换为ID3v2.3,因为windows资源管理器无法处理v2.4,这有点棘手,因为程序对是使用复制构造函数还是转换构造函数有点困惑 MP3Fi
MP3File mf = null;
try {
mf = (MP3File)AudioFileIO.read(new File(pathToMp3File));
} catch (Exception e) {}
ID3v23Tag tag;
if (mf.hasID3v2Tag()) tag = new ID3v23Tag(mf.getID3v2TagAsv24());
else if (mf.hasID3v1Tag()) tag = new ID3v23Tag(mf.getID3v1Tag());
else tag = new ID3v23Tag();
为此,您可以使用不同的库,例如或。我的应用程序必须能够读取id3v1或id3v11,但只能写入v23,因此我需要稍长一点的代码:
AudioFile mf;
Tag mTagsInFile;
...
mf = ... // open audio file the usual way
...
mTagsInFile = mf.getTag();
if (mTagsInFile == null)
{
//contrary to getTag(), getTagOrCreateAndSetDefault() ignores id3v1 tags
mTagsInFile = mf.getTagOrCreateAndSetDefault();
}
// mp3 id3v1 and id3v11 are suboptimal, convert to id3v23
if (mf instanceof MP3File)
{
MP3File mf3 = (MP3File) mf;
if (mf3.hasID3v1Tag() && !mf3.hasID3v2Tag())
{
// convert ID3v1 tag to ID3v23
mTagsInFile = new ID3v23Tag(mf3.getID3v1Tag());
mf3.setID3v1Tag(null); // remove v1 tags
mf3.setTag(mTagsInFile); // add v2 tags
}
}
基本上,我们必须知道getTagOrCreateAndSetDefault()和类似的函数不幸忽略了id3v1,因此我们首先必须调用getTag(),并且只有当这失败时,我们才调用前面提到的函数。
此外,代码还必须处理flac和mp4,因此我们确保只使用mp3文件进行转换。
最后,Jaudiotager中有一个bug。你可以换这条线
String genre = "(" + genreId + ") " + GenreTypes.getInstanceOf().getValueForId(genreId);
在“ID3v24Tag.java”中使用此
String genre = GenreTypes.getInstanceOf().getValueForId(genreId);
否则,idv1中的类型12将获得“(12)Other”,随后将其转换为“Other Other”,这不是我们所期望的。也许有人有更优雅的解决方案