2009-10-29 5 views
21

Je veux avoir un programme qui lit les métadonnées d'un fichier MP3. Mon programme devrait également pouvoir éditer ces métadonnées. Que puis-je faire?Comment lire les balises de fichiers MP3

Je dois chercher un code source ouvert. Mais ils ont du code; mais pas une idée simplifiée pour mon travail qu'ils vont faire. Lorsque j'ai lu plus loin, j'ai trouvé que les métadonnées étaient stockées dans le fichier MP3 lui-même. Mais je ne suis pas encore capable de me faire une idée complète de mon programme pour bébé.

Toute aide sera appréciée; avec un programme ou très idée (comme un algorithme). :)

+1

double exact: http : //stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java Plus beaucoup de choses MP3 dans la recherche: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76

Répondre

24

Les 128 derniers octets d'un fichier mp3 contient des métadonnées sur le fichier mp3., Vous pouvez écrire un programme pour lire les 128 derniers octets ...

MISE à JOUR:

ID3v1 mise en œuvre

les informations sont stockées dans les 128 derniers octets d'un MP3. L'étiquette a les champs suivants, et les offsets donnés ici, sont 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- Ceci est juste une façon laide d'obtenir des métadonnées et il pourrait ne pas vraiment être là parce que le monde est passé à id3v2. id3v1 est réellement obsolète. Id3v2 est plus complexe que cela, donc idéalement, vous devriez utiliser les bibliothèques existantes pour lire les données id3v2 à partir de mp3s. Juste en train d'exposer ça.

+0

Ce n'est pas vrai. – ChssPly76

+0

@ ChssPly76 ofcourse cela dépend de la version. Toutes les infos ne seront pas dans les 128 derniers octets. Mais c'est une approche simple si vous voulez juste obtenir des données à partir de mp3 qui ont des métadonnées id3 et id1. – Jaskirat

+0

Je voulais dire id3v1 et id3v2 pas id3 & id1 – Jaskirat

14

jd3lib est une bibliothèque Java qui gère les MP3 et leurs étiquettes. Probablement un point de départ utile.

+0

J'utilise jd3lib, mais il semble que c'est lent, et utilise trop de mémoire. – dariusiv

9

Vous pouvez utiliser apache tika API Java pour les méta-données d'analyse syntaxique de MP3 tels que titre, album, genre, duraion, compositeur, artiste et etc .. pots sont nécessaires tika-parseurs-1.4, tika -core-1.4.

Exemple de programme:

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

Ceci est une bonne solution pour lire les méta-données mp3, mais en utilisant tika je crois que nous ne pouvons pas mettre à jour les méta-données mp3. – yallam

0

Pour J2ME (qui est ce que je luttais avec), voici le code qui a fonctionné pour moi ..

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

} 
Questions connexes