2009-10-29 37 views
21

Tôi muốn có một chương trình đọc siêu dữ liệu từ một tệp MP3. Chương trình của tôi cũng có thể chỉnh sửa siêu dữ liệu này. Tôi có thể làm gì?Cách đọc thẻ tập tin MP3

Tôi phải tìm kiếm một số mã nguồn mở. Nhưng họ có mã; nhưng không đơn giản hóa ý tưởng cho công việc của tôi họ sẽ làm.

Khi đọc thêm, tôi thấy siêu dữ liệu được lưu trữ trong chính tệp MP3. Nhưng tôi chưa có ý tưởng đầy đủ về chương trình con của tôi.

Bất kỳ trợ giúp nào sẽ được đánh giá cao; với một chương trình hoặc rất ý tưởng (như một thuật toán). :)

+1

chính xác trùng lặp: http : //stackoverflow.com/questions/1527169/whats-the-easiest-way-to-extract-the-jpg-data-from-an-mp3-header-in-java Cộng với rất nhiều thứ MP3 trong tìm kiếm: http://stackoverflow.com/search?q=[java]+mp3 – ChssPly76

Trả lời

24

128 byte cuối cùng của một tập tin mp3 có chứa dữ liệu meta về tập tin mp3., Bạn có thể viết một chương trình để đọc 128 byte cuối cùng ...

UPDATE:

ID3v1 Thực hiện

Thông tin được lưu trữ trong 128 byte cuối cùng của một MP3. Thẻ có các trường sau đây và các khoảng trống được đưa ra ở đây, là từ 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 

CẢNH BÁO- Đây chỉ là cách xấu để nhận siêu dữ liệu và có thể không thực sự ở đó vì thế giới đã chuyển sang id3v2. id3v1 thực sự lỗi thời. Id3v2 phức tạp hơn điều này, vì vậy lý tưởng bạn nên sử dụng các thư viện hiện có để đọc dữ liệu id3v2 từ mp3. Chỉ cần đặt nó ra khỏi đó.

+0

Điều đó không đúng. – ChssPly76

+0

@ ChssPly76 ofcourse nó phụ thuộc vào phiên bản. Không phải tất cả thông tin sẽ nằm trong 128 byte cuối cùng. Nhưng đây là một cách tiếp cận đơn giản nếu bạn chỉ muốn nhận dữ liệu từ các tệp mp3 có siêu dữ liệu id3 và id1. – Jaskirat

+0

Tôi có nghĩa là id3v1 và id3v2 không phải id3 & id1 – Jaskirat

14

jd3lib là thư viện Java xử lý MP3 và thẻ của chúng. Có lẽ là một điểm khởi đầu hữu ích.

+0

Tôi đang sử dụng jd3lib, nhưng nó xuất hiện rằng nó là chậm, và sử dụng quá nhiều bộ nhớ. – dariusiv

9

Bạn có thể sử dụng apache tika Java API cho meta-data phân tích cú pháp từ MP3 như tiêu đề, album, thể loại, duraion, nhà soạn nhạc, nghệ sĩ và vv .. lọ cần là tika-parsers-1.4, tika -core-1.4.

Chương trình mẫu:

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

Đây là giải pháp tốt để đọc dữ liệu siêu dữ liệu mp3, nhưng sử dụng tika Tôi tin rằng chúng tôi không thể cập nhật dữ liệu siêu dữ liệu mp3. – yallam

0

Đối với J2ME (đó là những gì tôi đã phải vật lộn với), đây là đoạn code mà làm việc cho tôi ..

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

}