Метаданные MP3 не обновляются

Я хочу добавить название альбома в файлы mp3. Я использую библиотеку Jaudiotagger для чтения и записи метаданных mp3. В моем mp3-файле нет метаданных мультимедиа, кроме длины. Я приложил скриншот свойств файла Windows 1 такого mp3-файла. введите здесь описание изображения

Учитывая каталог, код просматривает все mp3-файлы внутри него и присваивает имя альбома каждому mp3-файлу. Код выполняется без ошибок, но когда я пытаюсь открыть свойства этого mp3-файла. Тем не менее, у него нет никакой информации об альбоме. Пожалуйста, помогите мне узнать, что мне не хватает.

Ниже мой код

public class Test {

    public static String albumName = null;

    public static String toCamelCase(final String strInput) {
        if (strInput==null)
            return null;
        final String init = strInput.replaceAll("-", " ").replaceAll("_", " ");
        final StringBuilder ret = new StringBuilder(init.length());

        for (final String word : init.split(" ")) {
            if (!word.isEmpty()) {
                ret.append(word.substring(0, 1).toUpperCase());
                ret.append(word.substring(1).toLowerCase());
            }
            if (!(ret.length()==init.length()))
                ret.append(" ");
        }
        return ret.toString();
    }

    private String getFileExtension(String fileName) {
        String extension = "";
        int i = fileName.lastIndexOf('.');
        int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

        if (i > p) {
            extension = fileName.substring(i+1);
        }
        return extension;
    }

    private void traverse(File dir) throws CannotReadException, TagException, ReadOnlyFileException, InvalidAudioFrameException, CannotWriteException {
        try {
            File[] files = dir.listFiles();
            for (File file : files) {
                boolean fileAlbumChecked = false;

                if (file.isDirectory()) {
                    if (Test.albumName == null)
                        Test.albumName = toCamelCase(file.getName());
                    System.out.println("directory:" + toCamelCase(file.getName()));
                    file.renameTo(new File(file.getCanonicalPath()+"/"+toCamelCase(file.getName())));
                    traverse(file);
                } else {
                    if (getFileExtension(file.getName()).equals("mp3")) {
                        MP3File mp3File  = (MP3File)AudioFileIO.read(file);
                        //MP3AudioHeader audioHeader = (MP3AudioHeader) mp3File.getAudioHeader();
                        boolean hasV1Tag = mp3File.hasID3v1Tag();
                        boolean hasV2Tag = mp3File.hasID3v2Tag();
                        System.out.println(hasV1Tag+", "+hasV2Tag);
                        Tag tag = mp3File.getTag();
                        //ID3v1Tag v1Tag = (ID3v1Tag)tag;
                        AbstractID3v2Tag v2Tag  = mp3File.getID3v2Tag();
                        ID3v24Tag v24Tag = mp3File.getID3v2TagAsv24();
                        String tempAlbumName = null;

                        AudioFile audioFile = AudioFileIO.read(file);
                        Tag tagwa = audioFile.getTag();
                        System.out.println("("+tagwa+")");
                        if (hasV1Tag) {
                            //Tag tag = mp3File.getTag();
                            //ID3v1Tag v1Tag = (ID3v1Tag)tag;
                            tempAlbumName = (tag.toString());
                            if (Test.albumName == null || Test.albumName.equalsIgnoreCase("unknown") || tempAlbumName != null) {
                                fileAlbumChecked = true;
                                Test.albumName = tempAlbumName;
                                tagwa.setField(FieldKey.ALBUM, Test.albumName);
                                audioFile.commit();
                            }
                        } else if (hasV2Tag) {
                            tempAlbumName = (v2Tag.getFirst(ID3v24Frames.FRAME_ID_ALBUM));
                            if (Test.albumName == null || Test.albumName.equalsIgnoreCase("unknown") || tempAlbumName != null) {
                                fileAlbumChecked = true;
                                Test.albumName = tempAlbumName;
                                tagwa.setField(FieldKey.ALBUM, Test.albumName);
                                audioFile.commit();
                            }   
                        } else {
                            if (tagwa == null) {
                                tagwa = audioFile.createDefaultTag();
                                System.out.println("("+tagwa+")"+", Class: "+tagwa.getClass());
                            }
                            tagwa.addField(FieldKey.ALBUM, Test.albumName);
                            //tagwa.setField(FieldKey.ALBUM, Test.albumName);
                            audioFile.commit();
                        }                       
                        //AudioFileIO.write(audioFile);
                    }                   
                    System.out.println("file:" + file.getCanonicalPath()+", Album: "+Test.albumName);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filePath = "C:\\music";
        File dir = new File(filePath);
        Test test = new Test();
        try {
            test.traverse(dir);
        } catch (CannotReadException | TagException | ReadOnlyFileException | InvalidAudioFrameException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (CannotWriteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Вывод

directory:Ddlj
false, false
(null)
(Tag content:
), Class: class org.jaudiotagger.tag.id3.ID3v23Tag
file:C:\music\DDLJ\DDLJ-HO_GAYA_HAI_TUJKO_PYAR_SAJNA.mp3, Album: Ddlj
false, false
(null)
(Tag content:
), Class: class org.jaudiotagger.tag.id3.ID3v23Tag
file:C:\music\DDLJ\DDLJ-TUJHE_DEKHA_TO.mp3, Album: Ddlj
false, false
(null)
(Tag content:
), Class: class org.jaudiotagger.tag.id3.ID3v23Tag
file:C:\music\DDLJ\DDLJ-ZARA_SA_JHOOM_LOON_MAIN.mp3, Album: Ddlj

Отслеживание audioFile.commit()

при отладке audioFile.commit(); в строке номер 103 он выполняет следующий код

if (id3v2tag == null)
{
    rfile = new RandomAccessFile(file, "rw");
    (new ID3v24Tag()).delete(rfile);
    (new ID3v23Tag()).delete(rfile);
    (new ID3v22Tag()).delete(rfile);
    logger.config("Deleting ID3v2 tag:"+file.getName());
    rfile.close(); //<-- comes till here
}
...
 rfile = new RandomAccessFile(file, "rw");
...
if (TagOptionSingleton.getInstance().isId3v1Save())
{
    logger.config("Processing ID3v1");
    if (id3v1tag == null)
    {
        logger.config("Deleting ID3v1");
        (new ID3v1Tag()).delete(rfile); //<-- comes till here too
    }
    ...
}
... //some catch statements
finally
{
    if (rfile != null)
    {
        rfile.close(); //<-- comes till here too
    }
}

и он выходит правильно без каких-либо ошибок.

Примечание: использование jaudiotagger-2.2.4


person Community    schedule 01.04.2016    source источник
comment
Интересно, какой тег возвращает audioFile.createDefaultTag()? Может быть, это не ID3-тег по какой-то причине, и вам нужно создать его самостоятельно? Попробуйте распечатать более подробную информацию о том, что происходит на важных этапах, чтобы вы могли увидеть, что может пойти не так. А еще лучше пройдитесь по нему с помощью отладчика.   -  person tyrel    schedule 04.04.2016
comment
@tyrel: Спасибо за внимание к этой проблеме. audioFile.createDefaulTag() возвращает Tag content: . Я также обновил свой код некоторыми выводами системы и включил результат. Пожалуйста, посмотрите. Дайте мне знать, если вам нужно больше.   -  person    schedule 04.04.2016
comment
Можете ли вы также распечатать (или посмотреть при входе в отладчик), какой класс возвращенного тега? Tag - это просто интерфейс, поэтому мне интересно, является ли реализация, выбранная по умолчанию, правильной.   -  person tyrel    schedule 04.04.2016
comment
@tyrel: это org.jaudiotagger.tag.id3.ID3v23Tag. Обновил мой код.   -  person    schedule 04.04.2016
comment
Хорошо, это приятно видеть. Вы пытались войти в commit, чтобы посмотреть, что он делает? Возможно, в библиотеке ошибка.   -  person tyrel    schedule 04.04.2016
comment
@tyrel: я проследил commit(), все получилось правильно. Обновите мой вопрос с отладкой commit() внутри org.jaudiotagger.audio.mp3.MP3File.class   -  person    schedule 04.04.2016
comment
Итак, у вас есть ID3v23Tag, тогда почему код commit находит id3v2tag == null и удаляет его? Разве это не должно быть добавлено?   -  person tyrel    schedule 04.04.2016


Ответы (1)


Следующий код считывает существующий тег ALBUM из файла MP3, а затем перезаписывает его новым тегом ALBUM.

MP3File audioFile = (MP3File) AudioFileIO.read(new File("test.mp3"));
Tag tag = audioFile.getTag();
if (tag == null) {
    tag = new ID3v22Tag();
}
List<TagField> albumFields = tag.getFields(FieldKey.ALBUM);
System.out.println("Existing ALBUM fields: " + albumFields);
tag.deleteField(FieldKey.ALBUM);
tag.addField(FieldKey.ALBUM, "test album 2");
audioFile.setTag(tag);
audioFile.save();

Он был протестирован для работы с java 1.7 и jaudiotagger 2.2.3 в Linux.

person Markus    schedule 07.04.2016