java读取mp3文件头信息

最近在做一个项目的实训,有关于音乐播放的,需要取到一些音乐信息,比如播放时长,演唱歌手,歌曲名称等等信息添加到数据库中。而MP3文件本身就是带有这些信息的

而后在了解到mp3文件有2种标签 ,ID3V1和ID3V2,mp3标签是位于一个 MP3 文件的开头或末尾的若干字节内的数据格式,附加了关于该 MP3 的歌曲名、演唱者、专辑名、标题、年代、歌曲风格、类型、备注等信息.(相当于注释)

id3v2是保存在mp3文件开头;id3v1是保存在mp3文件结尾;id3v2&id3v1是同时保存,优先存 id3v2。

现在常见的应该是ID3V2标签的。

所以百度过后,发现了一个jar包可以读取到mp3文件信息。

那么我们这里用到的jar包 是


        <!--读取MP3文件-->
        <dependency>
            <groupId>org</groupId>
            <artifactId>jaudiotagger</artifactId>
            <version>2.0.3</version>
        </dependency>

实现代码:

我们取信息,需要存储到一个实体类里面,那么我们创建一个Mp3Info类。


/**
 * 类的功能描述
 *
 * @author admin
 * @date 2018/12/22 17:36
 */
public class Mp3Info {
       //音乐名
    private String songName;
    //歌手名
    private String singerName;
    //专辑名
    private String album;
    //时长
    private Time duration;

    public String getSongName() {
        return songName;
    }

    public void setSongName(String songName) {
        this.songName = songName;
    }

    public String getSingerName() {
        return singerName;
    }

    public void setSingerName(String singerName) {
        this.singerName = singerName;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public Time getDuration() {
        return duration;
    }

    public void setDuration(Time duration) {
        this.duration = duration;
    }

    public Mp3Info() {
    }

   

    public Mp3Info(String songName, String singerName, String album, Time duration) {
        this.songName = songName;
        this.singerName = singerName;
        this.album = album;
        this.duration = duration;
    }

    @Override
    public String toString() {
        return "Mp3Info{" +
                "songName='" + songName + '\'' +
                ", singerName='" + singerName + '\'' +
                ", album='" + album + '\'' +
                ", duration=" + duration +
                '}';
    }
}

我这里为了调用简单,直接将我们的取信息的方法放入了Mp3Info类里面

    /**
     * @param filePath
     * @Description: 传入MP3文件地址,读取mp3文件信息
     * @Return: com.t.test.TestAll
     * @Auther: admin
     * @Date 2018/12/30 17:34
     */

    public Mp3Info getSongInfo(String filePath) {

        Mp3Info mp3Info = null;

        try {
//         读取文件信息
            MP3File mp3File = (MP3File) AudioFileIO.read(new File(filePath));
//            获取头
            MP3AudioHeader audioHeader = (MP3AudioHeader) mp3File.getAudioHeader();

            //歌名
            ID3v23Frame songnameFrame = (ID3v23Frame) mp3File.getID3v2Tag().frameMap.get("TIT2");
            String songName = songnameFrame.getContent();
            //歌手
            ID3v23Frame artistFrame = (ID3v23Frame) mp3File.getID3v2Tag().frameMap.get("TPE1");
            String artist = artistFrame.getContent();
            //专辑
            ID3v23Frame albumFrame = (ID3v23Frame) mp3File.getID3v2Tag().frameMap.get("TALB");
            String album = albumFrame.getContent();
            //时长
            int duration = audioHeader.getTrackLength();

            mp3Info = new Mp3Info(songName, artist, album, secondToDate(duration));

        } catch (Exception e) {
            e.printStackTrace();
        }

        return mp3Info;
    }

    /**
     * 秒转换为指定格式的日期
     *
     * @param second
     * @return
     */
    public static Time secondToDate(int second) {
        //转换为毫秒,但需要减去最基础的8小时
        Time time = new Time(second * 1000- 8 * 60 * 60 * 1000);
        return time;
    }

最后进行测试

    public static void main(String[] args) {
        Mp3Info songInfo = new Mp3Info().getSongInfo("C:\\Users\\13323\\Music\\薛之谦 - 天份.mp3");
        System.out.println(songInfo);
    }

 

注: 在百度java取MP3文件信息的时候,百度到很多的代码都不完全,要么就是乱码,其实现在很多mp3文件都是id3v2的,而那些代码都是通过id3v1去取得的,对自己造成了很大的麻烦。最后整合了下网上的代码,和自己的修改,才取到了这些信息。

你可以使用第三方库来读取 MP3 文件信息。一个常用的库是 "javazoom.jl.decoder"。以下是一个示例代码,演示如何读取 MP3 文件信息: ```java import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.JavaLayerException; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class MP3InfoReader { public static void main(String[] args) { String filePath = "path/to/your/mp3/file.mp3"; try { FileInputStream fis = new FileInputStream(filePath); Bitstream bitstream = new Bitstream(fis); Header header = bitstream.readFrame(); System.out.println("MPEG version: " + header.version()); System.out.println("Layer: " + header.layer_description()); System.out.println("Bitrate: " + header.bitrate_string()); System.out.println("Sample rate: " + header.frequency()); System.out.println("Duration: " + header.total_ms() + " milliseconds"); bitstream.close(); fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (BitstreamException e) { e.printStackTrace(); } catch (JavaLayerException e) { e.printStackTrace(); } } } ``` 请确保在运行代码之前,将 `path/to/your/mp3/file.mp3` 替换为你要读取MP3 文件的实际路径。这段代码使用了 "javazoom.jl.decoder" 库来解析 MP3 文件信息。你可以根据需求,进一步扩展这个示例代码来读取更多的 MP3 文件信息
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值