读取媒体文件';Java中的APIC图像数据

读取媒体文件';Java中的APIC图像数据,java,albumart,Java,Albumart,我正在我的HTTP服务器上工作,目前正在实现向客户端读取和显示媒体标签和文件信息(如mp4、m4a、wav等)的功能。到目前为止,我有一些标签,如标题、曲目编号、年份、专辑、艺术家、版权等。使用(二进制文件可用、网站)可以完美地处理多个文件扩展名 我现在要做的是实现读取和转换图像数据或相册插图/封面数据的功能,并将这些数据分别以png、jpeg等格式发送给客户端。我已经访问并阅读了APIC标记的官方部分,但我不知道如何转换数据,也不知道数据在标记中的实际起始位置 以下是我编写的代码,用于从包含相

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

我现在要做的是实现读取和转换图像数据或相册插图/封面数据的功能,并将这些数据分别以png、jpeg等格式发送给客户端。我已经访问并阅读了APIC标记的官方部分,但我不知道如何转换数据,也不知道数据在标记中的实际起始位置

以下是我编写的代码,用于从包含相册插图数据的文件中检索该数据:

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;
}
公共静态最终字节[]readFileArtwork(文件){
if(file==null | |!file.isFile()){
返回null;
}
音频文件afile=null;
试一试{
afile=AudioFileIO.read(文件);
}捕获(不能读取){
System.err.print(“无法读取文件:”);
e、 printStackTrace();
}捕获(IOE异常){
System.err.print(“发生I/O异常:”);
e、 printStackTrace();
}捕获(Tage例外){
System.err.print(“无法读取文件的标记数据:”);
e、 printStackTrace();
}catch(只读文件异常){/???
System.err.print(“无法读取文件:文件为只读:”);
e、 printStackTrace();
}捕获(无效){
System.err.print(“无法读取文件的音频帧数据:”);
e、 printStackTrace();
}
字节[]数据=新字节[0];
if(afile==null){
返回数据;
}
迭代器标记=afile.getTag().getFields();
while(tags.hasNext()){
TagField tag=tags.next();
if(tag.isBinary()){
if(tag.getId().equals(“APIC”)){
试一试{
data=tag.getRawContent();
}捕获(不支持的编码异常e){
System.err.print(“无法读取文件的图像数据:”);
e、 printStackTrace();
}
}
}
}
返回数据==null?新字节[0]:数据;
}

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

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

Artwork上的getPictureType()、getMimeType()等访问器可用于访问ID3规范中描述的其他图片元数据。

好的,谢谢您指出显而易见的问题。我马上回答,然后接受你的回答!我知道我遗漏了一些东西。是的,我太专注于读取标签数据了,以至于无法浏览api。