Как читать теги MP3 файлов

Я хочу иметь программу, которая читает метаданные из файла MP3. Моя программа также должна редактировать эти метаданные. Что я могу сделать?

Я должен искать какой-то открытый исходный код. Но у них есть код; но не упрощенная идея для моей работы, которую они собираются делать.

Читая дальше, я обнаружил, что метаданные хранятся в самом файле MP3. Но я пока не могу составить полное представление о моей детской программе.

Любая помощь будет оценена; с программой или самой идеей (как алгоритм). :)

вопрос задан 29.10.2009
vijay.shad
1579 репутация

5 ответов


  • 26 рейтинг

    Последние 128 байтов mp3-файла содержат метаданные о mp3-файле. , Вы можете написать программу для чтения последних 128 байтов. , ,

    ОБНОВЛЕНИЕ:

    ID3v1 Реализация

    Информация хранится в последних 128 байтах MP3. Тег имеет следующие поля, и смещения, приведенные здесь, от 0-127.

     Field      Length    Offsets
     Tag        3           0-2
     Songname   30          3-32
     Artist     30         33-62
     Album      30         63-92
     Year       4          93-96
     Comment    30         97-126
     Genre      1           127
    

    ПРЕДУПРЕЖДЕНИЕ. Это просто уродливый способ получения метаданных, которого может и не быть на самом деле, потому что мир перешел на id3v2. id3v1 на самом деле устарел. Id3v2 более сложный, поэтому в идеале вы должны использовать существующие библиотеки для чтения данных id3v2 из mp3s. Просто поместил это там.

    ответ дан Jaskirat, с репутацией 859, 29.10.2009
  • 14 рейтинг

    jd3lib - это библиотека Java, которая обрабатывает MP3 и их теги. Вероятно, полезная отправная точка.

    ответ дан Brian Agnew, с репутацией 222977, 29.10.2009
  • 12 рейтинг

    http: // www. id3. org / Implementations было бы неплохо для начала

    ответ дан user197132, с репутацией 121, 29.10.2009
  • 10 рейтинг

    Вы можете использовать apache tika Java API для анализа метаданных из MP3, таких как название, альбом, жанр, duraion, композитор, исполнитель и т. Д. . , необходимые банки tika-parsers-1. 4, тика-ядро-1. 4.

    Образец программы:

    package com.parse.mp3;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.tika.exception.TikaException;
    import org.apache.tika.metadata.Metadata;
    import org.apache.tika.parser.ParseContext;
    import org.apache.tika.parser.Parser;
    import org.apache.tika.parser.mp3.Mp3Parser;
    import org.xml.sax.ContentHandler;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class AudioParser {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            String fileLocation = "G:/asas/album/song.mp3";
    
            try {
    
            InputStream input = new FileInputStream(new File(fileLocation));
            ContentHandler handler = new DefaultHandler();
            Metadata metadata = new Metadata();
            Parser parser = new Mp3Parser();
            ParseContext parseCtx = new ParseContext();
            parser.parse(input, handler, metadata, parseCtx);
            input.close();
    
            // List all metadata
            String[] metadataNames = metadata.names();
    
            for(String name : metadataNames){
            System.out.println(name + ": " + metadata.get(name));
            }
    
            // Retrieve the necessary info from metadata
            // Names - title, xmpDM:artist etc. - mentioned below may differ based
            System.out.println("----------------------------------------------");
            System.out.println("Title: " + metadata.get("title"));
            System.out.println("Artists: " + metadata.get("xmpDM:artist"));
            System.out.println("Composer : "+metadata.get("xmpDM:composer"));
            System.out.println("Genre : "+metadata.get("xmpDM:genre"));
            System.out.println("Album : "+metadata.get("xmpDM:album"));
    
            } catch (FileNotFoundException e) {
            e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
            } catch (SAXException e) {
            e.printStackTrace();
            } catch (TikaException e) {
            e.printStackTrace();
            }
            }
        }
    
    ответ дан MAA, с репутацией 1564, 13.02.2014
  • 2 рейтинг

    Для J2ME (с чем я боролся) вот код, который работал для меня. ,

    import java.io.InputStream;
    import javax.microedition.io.Connector;
    import javax.microedition.io.file.FileConnection;
    import javax.microedition.lcdui.*;
    import javax.microedition.media.Manager;
    import javax.microedition.media.Player;
    import javax.microedition.media.control.MetaDataControl;
    import javax.microedition.midlet.MIDlet;
    
    public class MetaDataControlMIDlet extends MIDlet implements CommandListener {
      private Display display = null;
      private List list = new List("Message", List.IMPLICIT);
      private Command exitCommand = new Command("Exit", Command.EXIT, 1);
      private Alert alert = new Alert("Message");
      private Player player = null;  
    
      public MetaDataControlMIDlet() {    
        display = Display.getDisplay(this);
        alert.addCommand(exitCommand);
        alert.setCommandListener(this);
        list.addCommand(exitCommand);
        list.setCommandListener(this);
        //display.setCurrent(list);
    
      }
    
      public void startApp() {
          try {
          FileConnection connection = (FileConnection) Connector.open("file:///e:/breathe.mp3");
          InputStream is = null;
          is = connection.openInputStream();
          player = Manager.createPlayer(is, "audio/mp3");
          player.prefetch();
          player.realize();
        } catch (Exception e) {
          alert.setString(e.getMessage());
          display.setCurrent(alert);
          e.printStackTrace();
        }
    
        if (player != null) {
          MetaDataControl mControl = (MetaDataControl) player.getControl("javax.microedition.media.control.MetaDataControl");
          if (mControl == null) {
            alert.setString("No Meta Information");
            display.setCurrent(alert);
          } else {
            String[] keys = mControl.getKeys();
            for (int i = 0; i < keys.length; i++) {
              list.append(keys[i] + " -- " + mControl.getKeyValue(keys[i]), null);
            }
            display.setCurrent(list);
          }
        }
      }
    
      public void commandAction(Command cmd, Displayable disp) {
        if (cmd == exitCommand) {
          notifyDestroyed();
        }
      }
    
      public void pauseApp() {
      }
    
      public void destroyApp(boolean unconditional) {
      }
    
    }
    
    ответ дан user1048839, с репутацией 412, 24.02.2014