java读取mp3文件头信息

本文介绍如何使用Java读取MP3文件的ID3v2标签,包括歌曲名、歌手、专辑及时长,并演示了jaudiotagger库的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做一个项目的实训,有关于音乐播放的,需要取到一些音乐信息,比如播放时长,演唱歌手,歌曲名称等等信息添加到数据库中。而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去取得的,对自己造成了很大的麻烦。最后整合了下网上的代码,和自己的修改,才取到了这些信息。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值