2009-10-29 100 views
21

我想要一個程序從MP3文件中讀取元數據。我的程序也應該能夠編輯這些元數據。我能做什麼?如何讀取MP3文件標籤

我開始搜索一些開源代碼。但他們有代碼;但我的工作並不是簡單的想法。

當我進一步閱讀時,我發現元數據存儲在MP3文件本身。但我仍然無法完全理解我的寶貝計劃。

任何幫助將不勝感激;用程序或非常想法(如算法)。 :)

+1

完全重複:HTTP ://stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java在搜索中加上更多的MP3內容: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76 2009-10-29 18:55:32

回答

24

最後的128個字節的MP3文件的好地方包含了MP3文件的元數據,您可以編寫一個程序來讀取最後的128個字節...

UPDATE:

的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 

WARINING-這是剛開元數據的醜陋的方式,它可能實際上並不在那裏,因爲世界已經改變,以ID3V2。 id3v1實際上已經過時。 Id3v2比這更復雜,所以理想情況下,您應該使用現有的庫從mp3中讀取id3v2數據。把它放在那裏。

+0

這是不正確的。 – ChssPly76 2009-10-29 18:56:28

+0

@ ChssPly76當然它取決於版本。不是所有的信息都會在最後的128個字節中。但是,如果您只想從具有id3和id1元數據的mp3獲取數據,則這是一種簡單的方法。 – Jaskirat 2009-10-29 19:05:49

+0

我的意思是id3v1和id3v2不是id3&id1 – Jaskirat 2009-10-29 19:06:48

14

jd3lib是處理MP3及其標籤的Java庫。可能是一個有用的起點。

+0

我使用jd3lib,但它似乎很慢,並使用太多的內存。 – dariusiv 2013-12-13 06:45:28

9

您可以使用阿帕奇蒂卡用於元數據分析從MP3,如標題,專輯,流派,duraion,作曲家,藝術家和等的Java API ..需要的jar 蒂卡的解析器-1.4,蒂卡-core-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(); 
     } 
     } 
    } 
+0

這是一個很好的解決方案來讀取mp3元數據,但使用蒂卡我相信我們不能更新mp3元數據。 – yallam 2016-10-18 17:05:36

0

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

}