Изменить версию тега id3 программно (предпочтительно java)

Мне нужен способ изменить версию mp3-файлов с тегом id3 на некоторые id3v2.x программно, предпочтительно с использованием java, хотя все, что работает, лучше, чем ничего. Бонусные баллы, если он преобразует существующий тег, чтобы уже существующие данные не были уничтожены, а не полностью создает новый тег.

Изменить: Jaaudiotagger сработал, спасибо. К сожалению, мне пришлось ограничить его файлами 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();

person Blrp    schedule 09.02.2014    source источник


Ответы (2)


Для этой цели вы можете использовать разные библиотеки, например эту или это.

person Georgy Gobozov    schedule 09.02.2014

Мое приложение должно иметь возможность читать 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);

В противном случае жанр 12 из idv1 получит «(12) Other», который позже преобразуется в «Other Other», а это не то, что мы ожидаем. Может у кого есть более элегантное решение.

person Andreas K. aus M.    schedule 19.03.2018