Как определить, где в теге ID3v2 скрыто изображение?

Я пытаюсь загрузить jpg из mp3 (я делаю это во Flash, но это ни там, ни там), и я открыл несколько MP3 в шестнадцатеричном редакторе, и пока остальная часть тега довольно ясно, часть изображения - загадка. Есть метка «изображение/jpeg», но затем я ожидаю что-то, напоминающее длину байта для изображения или строковый ключ, разграничивающий конец изображения, но я не вижу ничего подобного, а документация по тегу совершенно бесполезна.

Хотелось бы получить некоторые рекомендации о том, что я ищу здесь. Удивлен, насколько неинтуитивно это получается!

ТИА


person Yevgeny Simkin    schedule 16.04.2011    source источник


Ответы (2)


Не изобретайте колесо, если вам не нравится боль. Это единственный источник библиотек, которые сделают всю работу за вас.

person msw    schedule 16.04.2011
comment
ха ха. Нет, я не ищу страданий, но я хочу построить это во флэш-памяти и не могу найти библиотеку, которая делает это ПЛЮС, я отказываюсь верить, что это очень сложно. - person Yevgeny Simkin; 16.04.2011
comment
чем больше я смотрю, тем больше убеждаюсь, что это сложнее, чем я изначально был уверен, что это не так :) - person Yevgeny Simkin; 17.04.2011

Хотя я обычно защищаю решение msw, на этом сайте, похоже, нет библиотеки для Flash. Однако он ДЕЙСТВИТЕЛЬНО имеет спецификацию ID3v2. Если вы посмотрите на раздел 4., ID3v2 frame overview, вы увидите, что заголовок фрейма включает размер фрейма, не включая заголовок. Я считаю, что можно с уверенностью предположить, что размер изображения можно рассчитать оттуда.

PD: Я предполагаю, что вы знаете, как работают теги ID3v2. В случае, если вы этого не сделаете, я рекомендую вам хотя бы бегло взглянуть на спецификацию. По сути, есть заголовок, расширенный заголовок, затем один или несколько кадров, содержащих данные тега (один кадр на датум) и, наконец, заполнение.

РЕДАКТИРОВАТЬ: В целях тестирования я открыл один из моих MP3-файлов с известными данными тегов в моем шестнадцатеричном редакторе. Нашел кадр с именем APIC, скопировал указанное количество байтов в новый файл и сохранил его как test.jpg. Не совсем работал.

Копнув дальше, я нашел спецификацию кадра. В частности, раздел 4.14, attached picture, который описывает своего рода «подзаголовок» для кадра (1-байтовое кодирование текста, MIME-тип с нулевым разделителем, 1-байтовый тип изображения и описание с нулевым разделителем). Поэтому я вырезал эту информацию из данных и скопировал оставшуюся часть в новый jpg, который Windows смогла показать.

Поэтому методика такова:

  • Получить размер кадра из заголовка кадра.
  • Разберите начало кадра для подзаголовка кадра и удалите его. (Где-то между 4 и бесконечными байтами)
  • Рассчитать размер изображения на основе оставшегося количества байтов.
person Kyte    schedule 16.04.2011
comment
да... Я понимаю, но документация немного плотная. Я надеялся, что поля будут немного более прямыми. Первые несколько полей (название трека, имя исполнителя и т. д.) совершенно очевидны, но затем следует тег изображения, за которым следует довольно длинная последовательность символов, одинаковых для всех mp3, так что они должны быть своего рода индикатором, но что они означают? а затем данные изображения, у которых нет явного END... Я удивлен, что это стандарт. :) - person Yevgeny Simkin; 17.04.2011
comment
Что ж, оказывается, это стандарт, просто задокументированный в другом месте. Проверьте редактирование. - person Kyte; 17.04.2011
comment
@Dr.Dredel: Вы получаете уведомление, если не добавляете @part? Я всегда задавался вопросом... - person Kyte; 17.04.2011