1. Главная страница » Компьютеры

Id3v1 id3v2 в чем разница

Автор: | 16.12.2019

  • Переработать оформление в соответствии с правилами написания статей.

Пожалуйста, после исправления проблемы исключите её из списка параметров. После устранения всех недостатков этот шаблон может быть удалён любым участником.

>Identify an MP3 ) — формат метаданных, наиболее часто используемый в звуковых файлах в формате MP3. В ID3 содержатся данные о названии трека, альбома, имени исполнителя и т. д., которые используются медиаплеерами и другими программами, а также аппаратными проигрывателями для отображения информации о файле и автоматического упорядочивания аудиоколлекции.

Существует две несовместимых версии ID3: ID3v1 и ID3v2.

Содержание

ID3v1 [ править | править код ]

После создания формата MP3 появилась проблема с хранением информации о музыкальном файле – в MP3 это никак не предусматривалось. В 1996 году Эрику Кэмпу пришла идея добавить участок памяти в файл, чтобы решить эту проблему.

Первая версия ID3-тегов занимала всего 128 байт, начинающихся со строки TAG. Тег помещался в конец файла для поддержания совместимости с ранними проигрывателями. Некоторые из них издавали небольшой шум, когда пытались прочесть тег, но большинство игнорировали его. Современные проигрыватели воспринимают эту информацию корректно.

Читайте также:  4G это какая скорость интернета

Поскольку для данных отводилось немного места, в таких тегах можно было хранить только основные сведения о песне: название, альбом, исполнитель, комментарий — по 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-файла для теста.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *