用Java读取媒体文件的APIC图像数据

时间:2015-12-07 03:12:28

标签: java albumart

我正在使用我的HTTP服务器,目前我正在实现向客户端读取和显示媒体标签和文件信息(如mp4,m4a,wav等)的功能。到目前为止,我有标题,如标题,曲目编号,年份,相册,艺术家,版权等,使用JAudioTagger(可用二进制文件here,网站here)完美地处理多个文件扩展名

我现在要做的是实现读取和转换图像数据或专辑图片/封面数据的能力,并将这些数据分别作为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;
}

1 个答案:

答案 0 :(得分:2)

您是否看过JAudioTagger和Java Artwork类中的ImageIO支持?要访问图片并将其转换为PNG,您应该可以执行以下操作:

for (Artwork artwork : afile.getTag().getArtworkList()) {
  BufferedImage bi = (BufferedImage) artwork.getImage();
  ImageIO.write(bi, "png", outputstream);
}

艺术品上的getPictureType(),getMimeType()等访问者可用于访问ID3规范中描述的其他图片元数据。