2009-10-29 21 views
21

मैं एक ऐसा प्रोग्राम चाहता हूं जो एमपी 3 फ़ाइल से मेटाडेटा पढ़ता हो। मेरे कार्यक्रम को इन मेटाडेटा को संपादित करने में भी सक्षम होना चाहिए। मैं क्या कर सकता हूँ?एमपी 3 फ़ाइल टैग कैसे पढ़ा जाए

मुझे कुछ ओपन सोर्स कोड के लिए खोजना पड़ा। लेकिन उनके पास कोड है; लेकिन मेरे काम के लिए सरल विचार नहीं है कि वे करने जा रहे हैं।

जब मैंने आगे पढ़ा तो मुझे पता चला कि मेटाडेटा एमपी 3 फ़ाइल में ही संग्रहीत है। लेकिन मैं अभी तक अपने बच्चे के कार्यक्रम का पूरा विचार नहीं कर पा रहा हूं।

किसी भी मदद की सराहना की जाएगी; एक कार्यक्रम या बहुत विचार (एक एल्गोरिदम की तरह) के साथ। :)

+1

सटीक अनुलिपि: http : //stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java प्लस खोज में एमपी 3 की बहुत सारी चीज़ें: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76

उत्तर

24

पिछले 128 एक एमपी 3 फ़ाइल के बाइट्स शुरू करने के लिए किया जाएगा एमपी 3 फाइल के बारे में मेटा डेटा शामिल हैं।, आप पिछले 128 बाइट्स पढ़ने के लिए एक प्रोग्राम लिखने कर सकते हैं ...

अद्यतन:

ID3v1 कार्यान्वयन

सूचना एक एमपी 3 के अंतिम 128 बाइट्स में संग्रहित है। टैग में निम्नलिखित फ़ील्ड हैं, और यहां दिए गए ऑफ़सेट 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 इससे अधिक जटिल है, इसलिए आदर्श रूप से आपको एमपी 3 से id3v2 डेटा पढ़ने के लिए मौजूदा पुस्तकालयों का उपयोग करना चाहिए। बस इसे बाहर रखो।

+0

यह सच नहीं है। – ChssPly76

+0

@ ChssPly76 का यह संस्करण पर निर्भर करता है। पिछले 128 बाइट्स में सभी जानकारी नहीं होगी। लेकिन यह एक आसान तरीका है यदि आप सिर्फ एमपी 3 से डेटा प्राप्त करना चाहते हैं जिसमें आईडी 3 और आईडी 1 मेटाडाटा है। – Jaskirat

+0

मेरा मतलब id3v1 और id3v2 id3 और id1 – Jaskirat

14

jd3lib एक जावा लाइब्रेरी है जो एमपी 3 और उनके टैग को संभालती है। शायद एक उपयोगी प्रारंभिक बिंदु।

+0

मैं jd3lib का उपयोग कर रहा हूं, लेकिन ऐसा लगता है कि यह धीमा है, और बहुत अधिक स्मृति का उपयोग करता है। – dariusiv

9

आप इस तरह के एमपी 3 से शीर्षक, एल्बम, शैली, duraion, संगीतकार, कलाकार और आदि के रूप में पार्स करने मेटा डेटा के लिए अपाचे टीका जावा एपीआई का उपयोग कर सकते हैं .. आवश्यक जार टीका-पारसर्स-1.4, टीका हैं कोर-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

एमपी 3 मेटा डेटा पढ़ने के लिए यह एक अच्छा समाधान है, लेकिन टीका का उपयोग करके मुझे विश्वास है कि हम एमपी 3 मेटा डेटा अपडेट नहीं कर सकते हैं। – yallam

0

जे 2 एमई (जो मैं के साथ क्या संघर्ष कर रहा था), यहाँ कोड है कि मेरे लिए काम किया है के लिए ..

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

} 
संबंधित मुद्दे