Чтение данных изображения APIC медиафайла в Java

Я работаю над своим HTTP-сервером, и в настоящее время я реализую возможность чтения и отображения тегов мультимедиа и информации о файлах (таких как mp4, m4a, wav и т. д.) для клиентов. Пока что у меня есть такие теги, как название, номер дорожки, год, альбом, исполнитель, авторские права и т. д., которые отлично работают для нескольких расширений файлов с использованием JAudioTagger (бинарные файлы доступны здесь, веб-сайт здесь).

Сейчас я пытаюсь реализовать возможность чтения и преобразования данных изображения или данных об обложке/обложке альбома и отправки этих данных клиентам в виде 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;
}

person Brian_Entei    schedule 07.12.2015    source источник


Ответы (1)


Вы ознакомились с поддержкой Artwork в JAudioTagger и Java ImageIO? Чтобы получить доступ к изображениям и преобразовать их в PNG, вы должны сделать что-то вроде:

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

Методы доступа getPictureType(), getMimeType() и т. д. в Artwork можно использовать для доступа к другим метаданным изображения, описанным в спецификации ID3.

person edparris    schedule 07.12.2015
comment
Хорошо, я буду, спасибо, что указали на очевидное. Я займусь этим, а затем приму ваш ответ! - person Brian_Entei; 08.12.2015
comment
Знал, что я что-то упускаю. - person Brian_Entei; 08.12.2015
comment
Да, я был слишком сосредоточен на попытке прочитать данные тега, чтобы копаться в API. - person Brian_Entei; 08.12.2015