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