2009-10-29 19 views
21

Chcę mieć program odczytujący metadane z pliku MP3. Mój program powinien także móc edytować te metadane. Co mogę zrobić?Jak czytać znaczniki plików MP3

Muszę wyszukać jakiś kod open source. Ale mają kod; ale nie uproszczony pomysł na moją pracę, którą zamierzają zrobić.

Gdy przeczytałem dalej, stwierdziłem, że metadane są przechowywane w samym pliku MP3. Ale nie jestem jeszcze w stanie w pełni zrozumieć mojego programu dla dzieci.

Każda pomoc zostanie doceniona; z programem lub bardzo pomysłem (jak algorytm). :)

+1

Dokładny duplikat: http : //stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java Plus dużo więcej plików MP3 w wyszukiwarce: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76

Odpowiedz

24

ostatnich 128 bajtów pliku mp3 zawiera meta dane o pliku MP3., Można napisać program do czytania ostatnie 128 bajtów ...

UPDATE:

ID3v1 Realizacja

informacja jest przechowywana w ciągu ostatnich 128 bajtów MP3. Tag ma następujące pola, a podane tutaj przesunięcia pochodzą z 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 

WARINIOWANIE - To tylko brzydki sposób na uzyskanie metadanych i może nie być obecny, ponieważ świat przeniósł się na id3v2. id3v1 jest właściwie przestarzały. Id3v2 jest bardziej skomplikowany, więc najlepiej użyć istniejących bibliotek do odczytu danych id3v2 z plików MP3. Po prostu to umieszczam.

+0

To nie jest prawda. – ChssPly76

+0

@ ChssPly76 ofcourse to zależy od wersji. Nie wszystkie informacje będą w ostatnich 128 bajtach. Ale jest to proste podejście, jeśli chcesz uzyskać dane z plików MP3, które mają metadane id3 i id1. – Jaskirat

+0

Miałem na myśli id3v1 i id3v2 nie id3 & id1 – Jaskirat

14

jd3lib to biblioteka Java, która obsługuje pliki MP3 i ich tagi. Prawdopodobnie przydatny punkt wyjścia.

+0

Używam jd3lib, ale wygląda na to, że jest wolny i używa zbyt dużo pamięci. – dariusiv

9

Można użyć Apache Tika Java API do parsowania metadanych z MP3, takich jak tytułu, albumu, gatunku, duraion, kompozytor, artysta i etc .. wymagane słoje są tika-parser-1.4, Tika -core-1,4.

Przykładowy program:

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

To jest dobre rozwiązanie do odczytywania metadanych mp3, ale używając tika uważam, że nie możemy aktualizować metadanych mp3. – yallam

0

dla J2ME (który jest co miałem problemy z), oto kod, który pracował dla mnie ..

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

} 
Powiązane problemy