如何读取MP3文件标签

2022-09-01 15:26:40

我想要一个从MP3文件中读取元数据的程序。我的程序也应该能够编辑这些元数据。我该怎么办?

我必须搜索一些开源代码。但是他们有代码;但不是简化我的工作的想法,他们将要做。

当我进一步阅读时,我发现元数据存储在MP3文件本身中。但我还没有能够完全了解我的婴儿计划。

任何帮助将不胜感激;使用程序或非常的想法(如算法)。:)


答案 1

mp3文件的最后128个字节包含有关mp3文件的元数据,您可以编写一个程序来读取最后128个字节...

更新:

ID3v1 实现

信息存储在 MP3 的最后 128 个字节中。Tag 具有以下字段,此处给出的偏移量介于 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比这更复杂,因此理想情况下,您应该使用现有库从mp3s读取id3v2数据。只是把这个放在那里。


答案 2

您可以使用apache tika Java API从MP3解析元数据,例如标题,专辑,流派,duraion,作曲家,艺术家等。必需的 jar 是 tika-parsers-1.4, tika-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();
        }
        }
    }

推荐