Как вставить тег ID3 длиннее 30 символов?

Я понимаю, что было бы проще использовать библиотеку, такую ​​как mp3agic или jaudiotagger, но я хотел редактировать теги id3 вручную в учебных целях.

У меня есть код, настроенный для правильного получения тегов, однако я заметил, что для некоторых песен заголовок обрезается до 30 символов, однако, когда я открываю файл .mp3 в музыкальном проигрывателе, отображается полное название, которое длиннее 30 символов.

Это код, который я использую прямо сейчас для просмотра тегов:

            File mp3File = new File(filePath);

            byte[] mp3Meta = new byte[128];

            try {
                //convert file into array of bytes
                fileReader = new FileInputStream(mp3File);
                fileReader.skip((int)mp3File.length() - 128);
                fileReader.read(mp3Meta);
                String id3 = new String(mp3Meta); 

                String tag = id3.substring(0, 3); 
               if (tag.equals("TAG")) {
                System.out.println("\nTitle: " + id3.substring(3, 32) + "\n" +
                    "Artist: " + id3.substring(33, 62) + "\n" +
                    "Album: " + id3.substring(63, 91) + "\n" +
                    "Year: " + id3.substring(93, 97) + "\n" +
                    "************************************************");
               } else {
                System.out.println("File has no ID3 tags..");
               }
            }catch(Exception e){
                e.printStackTrace();
            }

У меня есть идея, как я могу редактировать теги, но как я могу получить полное название (или любой тег), если оно длиннее 30 символов? Я читал, что есть способ добавить тег длиннее 30 символов в id3v2, но я не уверен, как получить доступ к кадрам id3v2.

Я считаю, что мне нужно определить, какую версию (id3v1 или id3v2) использует mp3, но я также не уверен, как это сделать программно.


person Brian    schedule 25.04.2016    source источник
comment
ID3, как вы говорите, ограничен 30 названиями символов. Чтобы прочитать/сохранить больше символов, вам нужно использовать ID3v2.   -  person dnault    schedule 26.04.2016
comment
dnault- Знаете ли вы, как я могу это сделать? Я прочитал страницу, найденную по адресу id3.org/ID3v2Easy, но я не уверен, сколько нужно компенсации которые нужно сделать, или конкретное расположение байтов для каждого тега.   -  person Brian    schedule 26.04.2016
comment
Как определить версию ID3: если вы суммируете размер всех этих полей, мы увидим, что 30+30+30+4+30+1 равняется 125 байтам, а не 128 байтам. Недостающие три байта можно найти в самом начале тега, перед названием песни. Эти три байта всегда являются тегами и являются идентификацией того, что это действительно тег ID3. Самый простой способ найти тег ID3v1/1.1 — найти слово TAG в 128 байтах от конца файла. Источник: id3.org/ID3v1   -  person PeterCo    schedule 26.04.2016
comment
PeterCo, да, это то, что я сейчас использую в своем коде. Но как я могу найти тег ID3v2 вместо ID3v1?   -  person Brian    schedule 26.04.2016
comment
Я не могу помочь вам с Java. Одно важное отличие: теги ID3v2 обычно располагаются в начале файла, теги ID3v1 — в конце. Возможно, вам следует заглянуть внутрь кода одной из многих существующих реализаций на id3.org/Implementations.   -  person PeterCo    schedule 27.04.2016


Ответы (2)


Я знаю, что это старый вопрос и что вы, вероятно, уже во всем разобрались, но я подумал, что отвечу более подробно всем, кто столкнется с этим вопросом с любой похожей проблемой.

ID3v1 (который иногда может называться просто «ID3») — это короткий структурированный блок данных, расположенный в конце файла. Теги ID3v2 во всех версиях состоят из множества необязательных «полей», которые обычно могут иметь любую (разумную) длину, в любом порядке и расположены в начале файла. Насколько я могу судить, единственная причина, по которой они имеют одинаковое имя, заключается в том, что они добавляются к одному и тому же типу файлов. Все, что написано для разбора/обновления одной версии, не будет знать, что делать с другой.

Как показывает исходный вопрос, ID3v1 особенно легко читается; самой большой частью любой полной реализации будет таблица поиска жанров. ID3v2 (будь то версия 2.3 или 2.4), как и подобает его большей мощи, решительно нет. На самом деле я бы рекомендовал его как упражнение среднего уровня для понимания метаданных или обучения реализации спецификаций, но для любой программы, где вы просто хотите использовать данные, было бы гораздо лучше просто ссылаться одна из готовых библиотек. К сожалению, я недостаточно знаю о реализациях Java, чтобы рекомендовать их, но немного осмотритесь, и вы найдете множество дискуссий о них.

person Sam May    schedule 13.05.2017

До рождения ID3v2 существовал неофициальный «Enhanced TAG»/«ID3 Extended»/«TAG+», чтобы добавить еще 60 байт почти ко всем полям ID3v1 (без избыточности). См. https://web.archive.org/web/20120310015458/http://www.fortunecity.com/underworld/sonic/3/id3tag.html и https://phoxis.org/2010/08/05/what-are-id3-tags-all-about/#id3v1ext

Другим полуофициальным стандартом была «Lyrics3» версии 2.00, которая может хранить 250 байтов почти для каждого поля ID3v1 (что является избыточным). См. http://id3.org/Lyrics3v2.

person AmigoJack    schedule 22.05.2020