我正在尝试使用Java ID3 Tag Library从mp3文件中获取图像。我已经设法获取并编辑了大部分代码,但我在获取图片时遇到了一些问题。我已经了解到的是,图像存储在ID3v2标记内,标题为 APIC 。我尝试用与其他标签类似的方式阅读它:
ID3v2_3 id3v2 = (ID3v2_3) mp3File.getID3v2Tag();
AbstractID3v2Frame frame = id3v2.getFrame("APIC");
if (frame != null) {
FrameBodyAPIC frameBody = (FrameBodyAPIC)frame.getBody();
// ...
}
问题在于,无论我在应用程序中加载什么MP3文件, APIC 框架都是NULL
。我确定该歌曲已分配了一张图片,因为它在Windows Media Player中正确显示。有没有人使用Java ID3 Tag Library库并设法加载歌曲的图片?我很感激任何帮助。
更新
我认为这可能是文件损坏的问题。因此,我首先尝试设置图像框,然后尝试读取它。不幸的是,结果相同 - 框架总是null
。我提供了我使用的代码:
public void setImage(ID3v2_3 id3v2, byte[] image) {
AbstractID3v2Frame frame = id3v2.getFrame("APIC");
// frame is always null
if (frame == null) {
frame = new ID3v2_3Frame();
}
FrameBodyAPIC frameBody = (FrameBodyAPIC) frame.getBody();
if (frameBody == null) {
frameBody = new FrameBodyAPIC();
}
frameBody.setObject("Picture Data", image);
frameBody.setObject("MIME Type", "image/png");
frame.setBody(frameBody);
// Set the newly created frame to mp3 file
id3v2.setFrame(frame);
// frame is still null - even just after setting it!
frame = id3v2.getFrame("APIC");
}
我使用这种方法来更新其他标签并且它有效,但在这种特殊情况下它不是。有谁知道这可能是什么原因?
答案 0 :(得分:0)
也许这段代码(未经测试,来源:https://sourceforge.net/p/javamusictag/discussion/253424/thread/4300f7b1/)可以提供帮助吗?
187 private ImageData extractImageFromFile(String srcFile) throws Exception {
188 ImageData imageData = null;
189 File sourceFile = new File(srcFile);
190 MP3File mp3file = new MP3File(sourceFile);
191 FilenameTag fileNameTag = mp3file.getFilenameTag();
192 AbstractID3v2 id3v2 = mp3file.getID3v2Tag();
193 if (id3v2 != null) {
194 AbstractID3v2Frame apic = id3v2.getFrame(PICTURE_TAG);
195 if (apic != null) {
196 AbstractMP3FragmentBody apicBody = apic.getBody();
197 String mimeType = (String) apicBody.getObject(MIME_TAG);
198 String fileExtension = getFileExtensionFromMimeType(mimeType);
199 if (fileExtension == null)
200 fileExtension = "jpg";
201 if (fileExtension.charAt(0) == '.')
202 fileExtension = fileExtension.substring(1);
203 Object bytes = apicBody.getObject(PICTURE_DATA_TAG);
204 if (bytes != null) {
205 imageData = new ImageData();
206 imageData.bytes = (byte[]) bytes;
207 imageData.fileExtension = fileExtension;
208 }
209 }
210 }
211 return imageData;
212 }