【问题标题】:Change id3 tag version programatically (pref java)以编程方式更改 id3 标记版本(首选 java)
【发布时间】:2014-03-06 09:58:25
【问题描述】:

我需要一种以编程方式将 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();

【问题讨论】:

    标签: java mp3 id3 id3v2


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我的应用程序必须能够读取 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) Other”,然后将其转换为“Other Other”,这不是我们所期望的。也许有人有更优雅的解决方案。

      【讨论】:

        猜你喜欢
        • 2014-11-24
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多