2009-10-29 96 views
21

Quiero tener un programa que lea los metadatos de un archivo MP3. Mi programa también debería poder editar estos metadatos. ¿Que puedo hacer?Cómo leer las etiquetas de archivos MP3

Tengo que buscar un código fuente abierto. Pero tienen código; pero no idea simplificada para mi trabajo que van a hacer.

Cuando leo más, encuentro que los metadatos se almacenan en el archivo MP3. Pero aún no soy capaz de hacer una idea completa de mi programa para bebés.

Cualquier ayuda será apreciada; con un programa o una idea (como un algoritmo). :)

+1

duplicado exacto: http : //stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java Además de muchas cosas de MP3 en la búsqueda: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76

Respuesta

24

Los últimos 128 bytes de un archivo MP3 contiene los metadatos del archivo MP3., Usted puede escribir un programa para leer los últimos 128 bytes ...

ACTUALIZACIÓN:

ID3v1 Implementación

La información se almacena en los últimos 128 bytes de un archivo MP3. La etiqueta tiene los siguientes campos, y los desplazamientos dados aquí, son de 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 

WARINING- Esto es sólo una manera fea de conseguir metadatos y que en realidad no podría estar allí porque el mundo se ha movido a id3v2. id3v1 es en realidad obsoleto. Id3v2 es más complejo que esto, por lo que idealmente debería usar bibliotecas existentes para leer los datos de id3v2 desde mp3. Solo poniendo esto por ahí.

+0

Eso no es verdad. – ChssPly76

+0

@ ChssPly76 por supuesto depende de la versión. No TODA la información estará en los últimos 128 bytes. Pero este es un enfoque simple si solo desea obtener datos de mp3 que tienen metadatos id3 e id1. – Jaskirat

+0

Quise decir id3v1 e id3v2 no id3 e id1 – Jaskirat

14

jd3lib es una biblioteca de Java que maneja MP3 y sus etiquetas. Probablemente un punto de partida útil.

+0

Estoy usando jd3lib, pero parece que es lento y usa demasiada memoria. – dariusiv

9

Puede utilizar Apache Tika API Java para meta-análisis sintáctico de datos de MP3 como título, álbum, género, duraion, compositor, artista y etc .. frascos requeridos son tika-analizadores-1.4, Tika -core-1.4.

Programa de ejemplo:

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(); 
     } 
     } 
    } 
+0

Esta es una buena solución para leer metadatos mp3, pero usando tika creo que no podemos actualizar metadatos mp3. – yallam

0

para J2ME (que es lo que estaba luchando con), aquí está el código que funcionó para mí ..

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) { 
    } 

} 
Cuestiones relacionadas