- Переработать оформление в соответствии с правилами написания статей.
Пожалуйста, после исправления проблемы исключите её из списка параметров. После устранения всех недостатков этот шаблон может быть удалён любым участником.
>Identify an MP3 ) — формат метаданных, наиболее часто используемый в звуковых файлах в формате MP3. В ID3 содержатся данные о названии трека, альбома, имени исполнителя и т. д., которые используются медиаплеерами и другими программами, а также аппаратными проигрывателями для отображения информации о файле и автоматического упорядочивания аудиоколлекции.
Существует две несовместимых версии ID3: ID3v1 и ID3v2.
Содержание
Содержание
ID3v1 [ править | править код ]
После создания формата MP3 появилась проблема с хранением информации о музыкальном файле – в MP3 это никак не предусматривалось. В 1996 году Эрику Кэмпу пришла идея добавить участок памяти в файл, чтобы решить эту проблему.
Первая версия ID3-тегов занимала всего 128 байт, начинающихся со строки TAG. Тег помещался в конец файла для поддержания совместимости с ранними проигрывателями. Некоторые из них издавали небольшой шум, когда пытались прочесть тег, но большинство игнорировали его. Современные проигрыватели воспринимают эту информацию корректно.
Поскольку для данных отводилось немного места, в таких тегах можно было хранить только основные сведения о песне: название, альбом, исполнитель, комментарий — по 30 байт на каждое поле, 4 байта для хранения года и один байт под жанр, который можно было выбрать из заранее определённого списка с 80 значениями (позднее Winamp расширил список своими 68 значениями). Если названия песен или альбомов содержали более 30 символов, они обрезались. Конечно, из-за ограничений по размеру ни о каких расширенных возможностях хранения метаданных не могло быть и речи.
Единственное усовершенствование, реализованное в версии 1.1, было предложено Майклом Мутшлером (Michael Mutschler) в 1997 году: так как поле под комментарий всё равно слишком мало для хранения чего-либо полезного, было решено сократить его на два байта, чтобы использовать их для хранения номера трека.
Расширенный формат [ править | править код ]
Расширенный тег — это дополнительный блок данных перед тегом >
Это был неофициальный стандарт, и он поддерживался малым количеством проигрывателей.
Структура ID3 [ править | править код ]
Строки разделяются нулями или пробелами. Неиспользуемые поля заполняются как пустые строки.
ID3(v1-v1.1): 128 байт
Поле | Длина, байт | Описание |
---|---|---|
Заголовок | 3 | «TAG» |
Название | 30 | 30-символьное название |
Исполнитель | 30 | 30-символьное имя исполнителя |
Альбом | 30 | 30-символьное название альбома |
Год | 4 | Строковая запись года |
Комментарий | 28 [1] или 30 | Комментарий |
Нулевой байт [1] | 1 | Если номер трека присутствует, этот байт равен 0 |
Track [1] | 1 | Номер трека в альбоме или 0; учитывается, только если предыдущее поле равно 0 |
Жанр | 1 | Индекс в списке жанров или 255 |
Расширенный тег [ править | править код ]
Помещается перед ID3v1 тегом: 227 байт
Поле | Длина, байт | Описание |
---|---|---|
Заголовок | 4 | «TAG+» |
Название | 60 | Дополнительные 60 байт для поля «Название» ID3v1 |
Исполнитель | 60 | Дополнительные 60 байт для поля «Исполнитель» ID3v1 |
Альбом | 60 | Дополнительные 60 байт для поля «Альбом» ID3v1 |
Скорость (стиль, тип) музыки | 1 | Чем больше число, тем «активней» музыка |
Жанр | 30 | 30-символьная строка |
Время начала | 6 | Время в формате mmm: ss |
Время конца | 6 | Время в формате mmm: ss |
Размеры полей ID3v1 с учётом расширенного тега составят:
Поле | Размер, байт |
---|---|
Название | 90 |
Исполнитель | 90 |
Альбом | 90 |
Lyrics3 [ править | править код ]
Lyrics3 — это первая попытка внедрить текст песни внутрь MP3-файла, реализованная Петром Стрнадом (Petr Strnad) во времена ID3v1.x. Текстовый блок помещался между строками LYRICSBEGIN и LYRICSEND в конце файла, перед тегом ID3v1.x (если его не было, то он создавался). Текст записывался в кодировке ISO-8859-1, максимальная длина 5100 байт, строки разделялись символами CR+LF, была реализована поддержка временны́х меток.
Со временем был выпущен формат Lyrics3 v2.00, имевший больше возможностей (в частности, значительно увеличился размер блока, появились дополнительные поля и возможность вставки изображения). Блок версии 2.00 помещался между строками LYRICSBEGIN и LYRICS200 и имел переменную длину, которая записывалась в последних шести байтах перед конечной строкой LYRICS200.
Идея не получила широкого распространения ввиду выхода стандарта ID3v2, в котором подобная идея была организована более гибко и функционально.
Критика и комментарии [ править | править код ]
ID3v1 много критиковали за ряд проблем. Прежде всего это слишком маленькие поля, размера которых недостаточно для хранения большинства информации — 30 байт не хватало для длинных названий, они урезались.
Предложение закрепить жанр за ограниченным числом альтернатив также нашло много противников. Многим просто не нравился предложенный список, в котором не отводилось места под такие жанры, как, например, минимализм или барокко.
ID3v2 [ править | править код ]
В ответ на критику ID3v1 был разработан новый стандарт — ID3v2. Он опубликован 26 марта 1998 года и полностью отличается от ID3v1.
Теги >[2] или в конце [3] файла. Тег состоит из нескольких «фреймов». Каждый фрейм содержит какие-либо метаданные. Например, фрейм «TIT2» содержит название произведения, а фрейм «WOAR» — ссылку на сайт исполнителя. Максимальный размер фрейма ограничен 16 МБ, а тег не может превышать 256 МБ. Текст хранится в кодировках UTF-16 [2] или UTF-8 [3] . Текстовые фреймы помечаются битом кодировки.
Стандарт ID3v2 определяет 84 типа фреймов, а также разрешает приложениям создавать свои фреймы. В числе стандартных имеются фреймы для хранения изображения обложки, числа ударов в минуту, информации об авторских правах и лицензии, текста песен, произвольного текста, ссылок и других данных.
Файл, содержащий тег в формате ID3v2, начинается с последовательности символов «ID3». Эти символы являются частью заголовка («Header») тега. Заголовок состоит из 10 байт и содержит поля, перечисленные ниже. Порядок байтов в ID3v2 — big endian. Размер — в 7 битовых байтах (старший бит устанавливается в 0).
Поле | Смещение, байт | Длина, байт | Описание |
---|---|---|---|
Сигнатура | 0 | 3 | «ID3» |
Версия | 3 | 2 | 2, 3 или 4 |
Флаги | 5 | 1 | |
Размер | 6 | 4 (7 битовых) |
Заголовок фрейма занимает 10 байт и содержит поля, перечисленные в следующей таблице.
Поле | Смещение, байт | Длина, байт | Описание |
---|---|---|---|
Идентификатор | 0 | 3 [4] , 4 [5] | Тип фрейма, заглавные латинские буквы и цифры |
Размер | 3 | 4 | |
Флаги | 5 | 2 |
Версии ID3v2 [ править | править код ]
- ID3v2.2 (26 марта 1998 года)
- ID3v2.3 (3 февраля 1999 года)
- ID3v2.4 (1 ноября 2000 года)
ID3v2.2 — первая широко используемая версия ID3v2. Ныне считается устаревшей. Используется трёхсимвольный идентификатор фрейма вместо четырёхсимвольного («TT2» для фрейма с названием произведения вместо «TIT2»).
Форматы фреймов ID3v2.2, ID3v2.3 и ID3v2.4 немного различаются.
ID3v2.3 — третья и наиболее распространённая на сегодняшний день версия. Расширяет размер поля «Идентификатор» до четырёх байт, добавляет поле «Количество фреймов». Фрейм может содержать несколько значений, разделённых знаком «/».
ID3v2.4 — четвёртая (текущая) версия. Позволяет хранить строки в кодировке UTF-8. Для разделения значений используется нулевой байт, а символ «/» можно использовать в тексте. Появилась возможность добавить тег в конец файла, как в ID3v1.
«Разделы» ID3v2 [ править | править код ]
В декабре 2005 года предложены [6] расширения для привязки текста и изображения к времени воспроизведения. Первое позволяет создавать оглавления для быстрого перехода к определённому месту (или главе) внутри аудиофайла. С помощью второго можно организовать показ изображений (слайдшоу). Типичное применение — подкастинг.
Критика [ править | править код ]
Из-за различий в версиях ID3v2 во многих проигрывателях до сих пор не реализована поддержка всех версий тегов. Проблема в том, что в разных версиях используются разные структуры данных. Например, для извлечения данных из фреймов «TIT2» (с названием произведения) и «USLT» (с текстом песни) требуются разные алгоритмы. В тегах других форматов, например в APEv2, данные хранятся в виде пар ключ-значение, и такой проблемы нет.
ID3v2 хранит информацию об аудиоданных. Например, во фрейме «TLEN» хранится длина песни, а во фрейме «AENC» — информация о методе сжатия.
В версиях ID3v2.2 и ID3v2.3 тег должен располагаться в начале файла, что упрощает потоковое воспроизведение, но требует перезаписи всего файла при изменении полей тега. Версия ID3v2.4 позволяет поместить данные тега в конец файла. Редакторы тегов могут оставлять свободное пространство в полях тега, чтобы предотвратить перезапись файла в случае увеличения тега, но эта операция не является стандартом: требования к тегам очень различаются, особенно если к музыке прилагается «APIC» (ассоциативные изображения).
Устаревшие реализации [ править | править код ]
Так как большинство файлов содержат теги ранних версий ID3v2, разработчики не спешат добавлять в свои продукты поддержку всех форматов тегов и всех типов фреймов, описанных в стандарте ID3v2.
Проводник Windows [ править | править код ]
Windows Explorer [ какой? ] поддерживает теги версий ID3v1 и ID3v2.3.
Проводник не может прочитать тег версии ID3v2.4, а при попытке его редактирования выдаёт ошибку 0x8007000D.
Проводник читает и записывает теги ID3v1, но с особенностями. Если в MP3-файле записан только тег ID3v1, Проводник его прочитает, а при редактировании — запишет данные в ID3v1 и добавит тег ID3v2.3. Редактирование тегов ID3v1 не поддерживается. Если в файле записаны теги ID3v1 и ID3v2.3, Проводник прочитает версию ID3v2.3, а при редактировании продублирует данные в оба тега. Если в MP3-файле не было никаких тегов, Проводник запишет только тег ID3v2.3.
Редактирование ID3 [ править | править код ]
Существует множество программ для редактирования тегов ID3. Среди них:
- правка сразу нескольких файлов («batch tagging»);
- поиск и замена.
Применение в других форматах и альтернативы [ править | править код ]
Теги >[7] . Предусмотрена возможность включения >[8] , но большинство программ её не поддерживают. В других форматах, основанных на контейнерах, применяются собственные теговые системы. Например Vorbis использует Vorbis comment и не поддерживает встраивание ID3, так как ID3 может нарушить структуру контейнера.
Практически любой пользователь телефона или смартфона знает, что при воспроизведении музыкального файла плеер «откуда-то» берет название композиции, имя исполнителя и множество прочей информации, отображая всё это в соответствующих элементах интерфейса.
Но немногие знают, что такое возможно лишь тогда, когда корректно заполнены теги ID3v1 и ID3v2. В противном случае мы увидим лишь название музыкального файла.
Для чего это нужно
В мире информации очень важную роль играют метаданные – дополнительные сведения, связанные с основным информационным массивом, вне зависимости от его природы.
Метаданные могут быть у текста, изображения, аудио- или видеозаписи и других видов контента. В случае музыки это может быть:
- Название трека.
- Название альбома или сборника.
- Исполнитель.
- Год записи композиции.
Помимо этого может использоваться еще несколько дополнительных полей.
В первую очередь, всё это нужно для отображения в приложении, проигрывающем файл. Помимо этого, наличие таких данных позволяет создавать коллекции, упорядочивать их и быстро осуществлять поиск по тому или иному критерию.
Одним из наиболее популярных форматов считается MP3, развитие которого прекратилось лишь недавно (в апреле 2017 года истек срок действия патентов) в связи с активным развитием loseless.
В процессе его совершенствования появился «социальный запрос» на добавление и отображение метаданных. И уже в 1996 году в структуру mp3-файлов были добавлены теги ID3v1.
Идея принадлежала Эрику Кэмпу. В конец файла добавлялся блок размером 128 байт, в котором в структурированном виде содержалось всё, что могло быть полезно пользователю.
Для каждого поля отводилось определенное количество байт: от 1, для выбираемого из списка жанра композиции, до 30 которых хватало для названия, автора и альбома.
Однажды мне понадобилось решить простенькую (как мне тогда казалось) задачу – в PHP-скрипте узнать длительность mp3-файла. Я слышал о ID3 тегах и сразу подумал, что информация о длительности хранится либо в тегах, либо в заголовках mp3-файла. Поверхностные поиски в интернете показали что за пару-тройку минут решить эту задачу не получится. Поскольку от природы я довольно любопытен а время не поджимало — решил не использовать сторонние инструменты а разобраться в одном из самых популярных форматов самостоятельно.
Если Вам интересно, что там внутри – добро пожаловать под кат (трафик).
В данной статье мы не будем подробно останавливаться на извлечении ID3v2 тегов – это можно вынести в отдельную статью, так как там есть различные нюансы. А так же на фрагментах заголовков, которые практически не используются в настоящее время (например, часть Emphasis заголовка mp3-фрейма). Так же мы не рассматриваем структуру самих аудиоданных — тех самых, которые слышим из колонок.
ID3 (от англ. Identify a MP3) — формат метаданных, наиболее часто используемый в звуковых файлах в формате MP3. ID3 подпись содержит данные о названии трека, альбома, имени исполнителя и т. д., которые используются мультимедиапроигрывателями и другими программами, а также аппаратными проигрывателями, для отображения информации о файле и автоматического упорядочивания аудиоколлекции.
Существует две абсолютно разных версии ID3-данных: ID3v1 и ID3v2.
ID3v1 – имеет фиксированный размер в 128 байт, которые дописываются в конец mp3-файла. Там можно хранить: название трека, исполнитель, альбом, год, комментарий, номер трека (для версии 1.1) и жанр.
Довольно быстро всем стало понятно, что 128 байт – очень уж небольшое место для хранения таких данных. И поэтому, со временем, появилась и успешно используется вторая версия данных – ID3v2.
В отличии от первой версии, теги v2 имеют переменную длину и размещаются в начале файла, что позволяет поддерживать потоковое воспроизведение. (Формат ID3v2.4 позволяет так же хранить данные и в конце файла).
Данные ID3v2 состоят из заголовка и последующих фреймов ID3v2. Например, в версии ID3v2.3 существует более 70 типов фреймов.
- маркер всегда равен ‘ID3’
- В данный момент имеются три версии ID3v2.2, ID3v2.3 и ID3v2.4
Версия v2.2 считается устаревшей.
v2.3 – самая популярная версия.
v2.4 – набирает популярность. Одно из отличий от v2.3 в том, что позволяет использовать кодировку UTF-8 (а не только UTF-16) - Флаги. В настоящее время используются только три (5,6,7) бита:
bin: %abc00000
a ‘unsynchronisation’ – используется только с MPEG-2 и MPEG-2.5 форматами.
b ‘Extended header’ – указывает на наличие расширенного заголовка
с ‘Experimental indicator’ – эксперементальный индикатор - Длина. Особенность указания длины данных ID3v2 в том, что в каждом байте 7-й бит не используется и всегда установлен в 0.
Рассмотрим пример:
В данном случае вместе с заголовком ID3v2 (10 байт) – данные ID3v2 занимают 1024 байта.
После ID3v2-заголовка идут собственно теги. Подробный разбор чтения тегов ID3v2, как сказано выше, я решил не включать в эту статью.
Теперь у нас есть информация о наличии и длине тегов ID3 и мы можем приступать в разбору mp3-фрейма и понять-таки – где же хранится длительность. А заодно понять и всё остальное.
Весь mp3-файл состоит из фреймов, которые можно извлекать только последовательно. Фрейм содержит в себе заголовок и аудио-данные. Поскольку мы не ставим себе целью написать прошивку для магнитофона – нас интересует именно заголовок фрейма.
О нем подробнее (куча таблиц и сухой информации)
Размер заголовка – 4 байта.
Описание:
- [0-10] Маркер – 11 бит, заполненные единицами (Frame sync)
- [11-12] Индекс версии MPEG (Audio version ID)
- [13-14] Индекс версии Layer (Layer index)
Кстати, MP3 – это MPEG-1 Layer III - [15] Бит защиты (Protection bit)
1 – нет защиты
0 – заголовок защищен 16-бит. CRC (следует за заголовком) - [16-19] Индекс битрейта (Bitrate index)
В таблице хранятся значения битрейта в килобит/сек. Однако в данном формате подразумевается, что 1 килобит = 1000 бит, а не 1024. Таким образом 96 Кбит/сек = 96000 бит/сек. - [20-21] Индекс частоты дискретизации (Sampling rate index)
- [22] Бит смещения (Padding bit)
Если он установлен, то данные смещаются на 1 байт. Это важно для расчета размера фрейма. - [23] Бит private (только для информации)
- [24-25] Режим канала (Channel mode)
- [26-27] Расширение режима канала. (Mode extension) Используется только с Joint stereo
- [28] Копирайт (Copyright bit) – только для информации
- [29] Оригинал (Original bit) – только для информации.
- [30-31] Акцент (Emphasis) – в данный момент практически не используется.
Режимы сжатия данных или какой бывает битрейт
Существует 3 режима сжатия данных:
CBR (constant bitrate) – постоянный битрейт. Не меняется на всем протяжении трека.
VBR (variable bitrate) – переменный битрейт. При этом сжатии битрейт постоянно меняется на протяжении трека.
ABR (average bitrate) – усредненный битрейт. Это понятие используется только при кодировании файла. На «выходе» получается файл с VBR.
Длительность = Размер аудиоданных / Битрейт (в битах!) * 8
Например, файл имеет размер 350670 байт. Есть > Длительность = 349518 / 96000 * 8 = 29,1265 = 29 секунд
Необходимо пояснить – как определить режим сжатия. Всё просто. Если файл сжат с VBR – то добавляется VBR-заголовок. По его наличию мы и можем понять, что используется переменный битрейт.
Есть два вида заголовков: Xing и VBRI.
Xing размещается со смещением от начала первого mp3-фрейма в позиции, согласно таблице:
Например: у нас >
Заголовок VBRI всегда размещается со смещением +32 байта от начала первого mp3-фрейма.
Первые четыре байта в обоих заголовках содержат маркер ‘Xing’ или ‘Info’ для Xing. И ‘VBRI’ для VBRI.
Эти VBR заголовки имеют переменную длину и содержат различную информацию о кодировании файла. Подробнее о структуре заголовков VBR (и не только) можно почитать, например, тут.
Я же расскажу только о том, что нас интересует в данный момент. А именно – количество фреймов (Number of Frames). Это число длиной 4 байта.
В заголовке Xing оно содержится по смещению +8 байт от начала заголовка. В VBRI +14 байт от начала заголовка.
Используя таблицу Сэмплов на фрейм (Sampler Per Frame) мы можем получить длительность mp3-файла, закодированного с переменным битрейтом.
Длительность = Количество фреймов * Сэмплов на фрейм / Частоту дискретизации
Например: из заголовка VBRI получили количество фреймов 1118, сэмплов на фрейм = 1152. Частота дискретизации = 44100.
Длительность = 1118 * 1152 / 44100 = 29.204 = 29 секунд.
На этом на сегодня всё. Если был кому-то полезен — спасибо.
Для тех, кто захочет немедленно поковырять внутренности mp3 — Тут лежат скрипт на php, которые я писал для себя одновременно с данной статьей и четыре небольших mp3-файла для теста.