2009-10-29 104 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) { 
    } 

}