在 Java 中读取媒体文件的 APIC 图像数据
Read media file's APIC image data in Java
我正在我的 HTTP 服务器上工作,我目前正在实现读取和显示媒体标签和文件信息(例如 mp4、m4a、wav 等)给客户端的功能。到目前为止,我有标题、曲目编号、年份、专辑、艺术家、版权等标签。使用 JAudioTagger(binaries available here, website here).
可以完美地处理多个文件扩展名
我现在要做的是实现读取和转换图像数据或相册 artwork/cover 数据的能力,并将该数据分别以 png、jpeg 等形式发送给客户端。我已经访问并阅读了关于 APIC 标签的官方部分 here,但我无法弄清楚如何转换数据或数据在标签中实际开始的位置。
这是我编写的用于从包含它的文件中检索专辑插图数据的代码:
public static final byte[] readFileArtwork(File file) {
if(file == null || !file.isFile()) {
return null;
}
AudioFile afile = null;
try {
afile = AudioFileIO.read(file);
} catch(CannotReadException e) {
System.err.print("Unable to read file: ");
e.printStackTrace();
} catch(IOException e) {
System.err.print("An I/O Exception occurred: ");
e.printStackTrace();
} catch(TagException e) {
System.err.print("Unable to read file's tag data: ");
e.printStackTrace();
} catch(ReadOnlyFileException e) {//???
System.err.print("Unable to read file: File is read only: ");
e.printStackTrace();
} catch(InvalidAudioFrameException e) {
System.err.print("Unable to read file's audio frame data: ");
e.printStackTrace();
}
byte[] data = new byte[0];
if(afile == null) {
return data;
}
Iterator<TagField> tags = afile.getTag().getFields();
while(tags.hasNext()) {
TagField tag = tags.next();
if(tag.isBinary()) {
if(tag.getId().equals("APIC")) {
try {
data = tag.getRawContent();
} catch(UnsupportedEncodingException e) {
System.err.print("Unable to read file's image data: ");
e.printStackTrace();
}
}
}
}
return data == null ? new byte[0] : data;
}
你看过 Artwork support in JAudioTagger and the Java ImageIO class 了吗?要访问图片并将它们转换为 PNG,您应该能够执行以下操作:
for (Artwork artwork : afile.getTag().getArtworkList()) {
BufferedImage bi = (BufferedImage) artwork.getImage();
ImageIO.write(bi, "png", outputstream);
}
Artwork 上的 getPictureType()、getMimeType() 等访问器可用于访问 ID3 规范中描述的其他图片元数据。
我正在我的 HTTP 服务器上工作,我目前正在实现读取和显示媒体标签和文件信息(例如 mp4、m4a、wav 等)给客户端的功能。到目前为止,我有标题、曲目编号、年份、专辑、艺术家、版权等标签。使用 JAudioTagger(binaries available here, website here).
可以完美地处理多个文件扩展名我现在要做的是实现读取和转换图像数据或相册 artwork/cover 数据的能力,并将该数据分别以 png、jpeg 等形式发送给客户端。我已经访问并阅读了关于 APIC 标签的官方部分 here,但我无法弄清楚如何转换数据或数据在标签中实际开始的位置。
这是我编写的用于从包含它的文件中检索专辑插图数据的代码:
public static final byte[] readFileArtwork(File file) {
if(file == null || !file.isFile()) {
return null;
}
AudioFile afile = null;
try {
afile = AudioFileIO.read(file);
} catch(CannotReadException e) {
System.err.print("Unable to read file: ");
e.printStackTrace();
} catch(IOException e) {
System.err.print("An I/O Exception occurred: ");
e.printStackTrace();
} catch(TagException e) {
System.err.print("Unable to read file's tag data: ");
e.printStackTrace();
} catch(ReadOnlyFileException e) {//???
System.err.print("Unable to read file: File is read only: ");
e.printStackTrace();
} catch(InvalidAudioFrameException e) {
System.err.print("Unable to read file's audio frame data: ");
e.printStackTrace();
}
byte[] data = new byte[0];
if(afile == null) {
return data;
}
Iterator<TagField> tags = afile.getTag().getFields();
while(tags.hasNext()) {
TagField tag = tags.next();
if(tag.isBinary()) {
if(tag.getId().equals("APIC")) {
try {
data = tag.getRawContent();
} catch(UnsupportedEncodingException e) {
System.err.print("Unable to read file's image data: ");
e.printStackTrace();
}
}
}
}
return data == null ? new byte[0] : data;
}
你看过 Artwork support in JAudioTagger and the Java ImageIO class 了吗?要访问图片并将它们转换为 PNG,您应该能够执行以下操作:
for (Artwork artwork : afile.getTag().getArtworkList()) {
BufferedImage bi = (BufferedImage) artwork.getImage();
ImageIO.write(bi, "png", outputstream);
}
Artwork 上的 getPictureType()、getMimeType() 等访问器可用于访问 ID3 规范中描述的其他图片元数据。