以编程方式更改id3标签版本(pref java)

时间:2014-02-09 01:22:08

标签: java mp3 id3 id3v2

我需要一种方法来将mp3文件的id3标签版本以编程方式更改为某些id3v2.x,最好使用java,尽管任何有效的东西都比没有好。奖励积分如果它转换现有标签,以便不破坏现有数据,而不是完全创建新标签。

编辑:Jaudiotagger工作,谢谢。遗憾的是,我不得不将其限制为mp3文件,只保存以前标签中包含的数据(如果它们是id3)。我决定将标记转换为ID3v2.3,因为Windows资源管理器无法处理v2.4,并且它有点棘手,因为程序对是否使用复制构造函数或转换构造函数感到有点困惑。

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();

2 个答案:

答案 0 :(得分:0)

您可以为此目的使用不同的库,例如thisthis

答案 1 :(得分:0)

我的应用程序必须能够读取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文件进行转换。 最后JaudioTagger中有一个错误。您可以替换此行

                String genre = "(" + genreId + ") " + GenreTypes.getInstanceOf().getValueForId(genreId);

;" ID3v24Tag.java"用这个

                String genre = GenreTypes.getInstanceOf().getValueForId(genreId);

否则来自idv1的流派12将获得"(12)其他"后来转换为"其他其他"这不是我们所期望的。也许某人有一个更优雅的解决方案。