如何用Java MP3 ID3 Tag Library或jaudiotagger获取MP3外部封面文件名
外部封面关联信息的存储位置
你在MediaMonkey中看到的外部封面文件名,存储在ID3v2标签的APIC(Attached Picture)帧中,符合ID3v2官方规范:当APIC帧的MIME类型字段值为-->时,帧内不再存储内嵌的二进制封面数据,而是直接存储外部封面文件的相对/绝对路径,同目录关联的jpg文件名就保存在这个字段内。
补充兜底逻辑:部分未显式配置关联的MP3文件,播放器会默认读取同目录下的
cover.jpg、folder.jpg、album.jpg这类通用命名的封面文件,你可以在读取标签无结果时增加该兼容逻辑。
对应Java库的读取实现
1. 使用Java MP3 ID3 Tag Library读取
import org.farng.mp3.MP3File; import org.farng.mp3.id3.AbstractID3v2; import org.farng.mp3.id3.FrameBodyAPIC; import java.util.Iterator; public class ExternalCoverReader { public String getExternalCoverPath(String mp3FilePath) throws Exception { MP3File mp3File = new MP3File(mp3FilePath); if (!mp3File.hasID3v2Tag()) { return null; } AbstractID3v2 id3v2 = mp3File.getID3v2Tag(); Iterator<?> apicFrameIterator = id3v2.getFrames("APIC"); while (apicFrameIterator.hasNext()) { Object frame = apicFrameIterator.next(); FrameBodyAPIC apicBody = (FrameBodyAPIC) ((org.farng.mp3.id3.ID3v2Frame) frame).getBody(); String mimeType = apicBody.getObject("MIME Type").toString(); if ("-->".equals(mimeType)) { return apicBody.getObject("Picture Data").toString(); } } return null; } }
2. 使用jaudiotagger读取
import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.tag.id3.ID3v2Tag; import org.jaudiotagger.tag.images.Artwork; import java.io.File; public class ExternalCoverReader { public String getExternalCoverPath(String mp3FilePath) throws Exception { AudioFile audioFile = AudioFileIO.read(new File(mp3FilePath)); if (audioFile.getTag() instanceof ID3v2Tag id3v2Tag) { for (Artwork artwork : id3v2Tag.getArtworkList()) { if (artwork.isLinked()) { return artwork.getImageUrl(); } } } return null; } }
拿到返回的路径后,如果是相对路径,默认相对于MP3文件所在目录,直接拼接即可得到封面文件的完整路径。
内容的提问来源于stack exchange,提问作者Francisco Javier Rojas
相关产品推荐
相关产品推荐

