之前在网上搜索获取mp3信息时花费了很多时间,主要是遇到了无法读取中文信息的问题,后来发现是标签类用错了。
我做了一些整合以后,写了三个工具方法,分别是获取歌曲信息,设置歌曲信息和获取封面图片。
/**
* 获取歌曲信息构造Music对象
*
* @param file 歌曲路径
* @return Music对象
* @throws Exception Exception
*/
public static Music getMusicInfo(File file) throws Exception {
//mp3文件
MP3File mp3File = (MP3File) AudioFileIO.read(file);
AudioHeader audioHeader = mp3File.getAudioHeader();
//标签
Tag tag = mp3File.getID3v2TagAsv24();
if (tag != null) {
//歌曲名
String musicName = tag.getFirst(FieldKey.TITLE);
//歌手
String artist = tag.getFirst(FieldKey.ARTIST);
//专辑
String album = tag.getFirst(FieldKey.ALBUM);
//时长
String duration = transDuration(audioHeader.getTrackLength());
//路径
String path = file.getAbsolutePath();
//封面
ImageIcon icon = null;
byte[] imageData = getMp3Image(file);
if (imageData != null) {
icon = new ImageIcon(Toolkit.getDefaultToolkit().createImage(imageData, 0, imageData.length));
}
return new Music(musicName, artist, album, duration, path, icon);
}
return new Music();
}
这里的标签类应该使用Asv24的
/**
* 设置歌曲信息
* @param file 歌曲文件
* @param musicName 歌名
* @param artist 作者
* @param album 专辑
* @throws Exception exception
*/
public static void setMusicInfo(File file, String musicName, String artist, String album) throws Exception {
AbstractID3v2Tag tag;
MP3File mp3File = (MP3File) AudioFileIO.read(file);
tag = mp3File.getID3v2TagAsv24();
if (tag != null) {
//歌曲名
tag.setField(FieldKey.TITLE, musicName);
//歌手
tag.setField(FieldKey.ARTIST, artist);
//专辑
tag.setField(FieldKey.ALBUM, album);
}
//设置标签
mp3File.setID3v2Tag(tag);
//保存歌曲文件
mp3File.save(file);
}
/**
* 获取MP3封面图片
*
* @param mp3File mp3文件
* @return 图片字节数组
*/
private static byte[] getMp3Image(File mp3File) {
byte[] imageData;
try {
MP3File mp3file = new MP3File(mp3File);
AbstractID3v2Tag tag = mp3file.getID3v2Tag();
AbstractID3v2Frame frame = (AbstractID3v2Frame) tag.getFrame("APIC");
FrameBodyAPIC body;
if (frame != null && !frame.isEmpty()) {
body = (FrameBodyAPIC) frame.getBody();
imageData = body.getImageData();
return imageData;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}