2009-10-29 7 views
21

Ich möchte ein Programm haben, das Metadaten aus einer MP3-Datei liest. Mein Programm sollte diese Metadaten auch bearbeiten können. Was kann ich tun?So lesen Sie MP3-Datei-Tags

Ich musste nach etwas offenem Quellcode suchen. Aber sie haben Code; aber keine vereinfachte Idee für meinen Job, den sie machen werden.

Wenn ich weiter lese, fand ich die Metadaten in der MP3-Datei selbst gespeichert. Aber ich bin noch nicht in der Lage, mir eine Vorstellung von meinem Babyprogramm zu machen.

Jede Hilfe wird geschätzt; mit einem Programm oder einer Idee (wie ein Algorithmus). :)

+1

Exaktes Duplikat: http : //stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java Plus viel mehr von MP3 Sachen in der Suche: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76

Antwort

24

Die letzten 128 Bytes einer MP3-Datei zu starten enthält Metadaten über die mp3-Datei., Sie ein Programm schreiben, können die letzten 128 Bytes zu lesen ...

UPDATE:

ID3v1 Implementierung

Die Informationen sind in den letzten 128 Bytes eines MP3 gespeichert. Das Tag hat die folgenden Felder und die hier angegebenen Offsets sind 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- Dies ist nur eine hässliche Art und Weise Metadaten zu bekommen und es könnte nicht wirklich dort sein, weil die Welt zu id3v2 bewegt hat. id3v1 ist eigentlich veraltet. Id3v2 ist komplexer als das, also sollten Sie idealerweise vorhandene Bibliotheken verwenden, um id3v2-Daten aus mp3s zu lesen. Einfach das da draußen hinstellen.

+0

Das ist nicht wahr. – ChssPly76

+0

@ ChssPly76 natürlich hängt es von der Version ab. Nicht ALLE Informationen werden in den letzten 128 Bytes sein. Aber dies ist ein einfacher Ansatz, wenn Sie nur Daten von MP3s mit ID3- und ID1-Metadaten erhalten möchten. – Jaskirat

+0

Ich meinte ID3V1 und ID3V2 nicht ID3 & ID1 – Jaskirat

14

jd3lib ist eine Java-Bibliothek, die MP3s und ihre Tags behandelt. Wahrscheinlich ein nützlicher Ausgangspunkt.

+0

Ich benutze jd3lib, aber es scheint, dass es langsam ist, und zu viel Speicher verwendet. – dariusiv

9

können Sie verwenden Apache Tika Java API für Meta-Daten von MP3 Parsen wie Titel, Album, Genre, duraion, Komponist, Interpret und etc .. erforderlich Gläser sind tika-Parser-1.4, tika -Kern-1.4.

Beispielprogramm:

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

Dies ist eine gute Lösung, MP3-Metadaten zu lesen, aber mit Tika ich glaube, wir können MP3-Metadaten nicht aktualisieren. – yallam

0

Für J2ME (das ist, was ich mit rang), hier ist der Code, der für mich gearbeitet ..

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

}