[TC] Кое-что о MP3-файлах

Здравствуйте, все!
Тут в рассылках [Integr], [TC] одновременно обсуждались разные вопросы
по MP3. Точно не помню кто, что, где, когда. Примерные формулировки:
- чем резать MP3-файлы;
- принципы работы таких "резающих" программ;
- чем склеивать MP3-файлы;
- почему аудиоредакторы напрямую не производят обработку MP3-файлов;
и т.д. Я бы и не влезал в эти дела, но тут было предложено соединять
MP3-файлы Тотал Коммандером без всяких оговорок. Были письма "за", а вот
критики не было. Считаю, что использовать как общий метод сборку Тоталом или
bat-файлами нельзя. Меня попросили "объясниться", пообещал сделать
старт-топик по MP3-файлам и вот выполняю. Это письмо шлю сразу в обе
рассылки - может кое-что будет интересным для подписчиков и из этой и из той
рассылки, хотя многие из нас как Фигаро - и тут, и там...
Немного теории очень упрощённо. Для комп. обработки аналогового
аудиосигнала его цифруют - через малые одинаковые промежутки времени
измеряют значения (амплитуду). То, что мы называем частотой дискретизации,
например, 44100 герц - это сэмплрейт (samplerate), то есть за секунду
делается 44100 измерений, выборок, сэмплов. По стандарту MP3 каждые 1152,
если мне не изменяет память, сэмпла кодируются для сжатия в один неделимый
фрейм. Можете легко точно вычислить его продолжительность. Это десятые,
сотые доли секунды (зависит от сэмплрейта). Тогда получается, что
какая-нибудь песня в MP3 формате состоит из тысяч и тысяч фреймов -
неделимых боевых единиц MP3-файла. Первые байты фрейма содержат инфу о
битрейте, сэмплрейте, режиме (моно, стерео, джоинт), оригинальный ли это
файл, версии MPEG, лейере и так далее. Но там нет информации о других
фреймах, CBR, ABR, VBR, продолжительности звучания файла. А вот в каком-то
формате (огг ворбис?) каждый фрейм "знает" свой порядковый номер.
Получается такая картина. При кодировании по стандарту MP3 с его
психоакустическими алгоритмами каждый фрейм делается кодером с учётом
предыдущих. Но вот как только MP3-файл создан, то мы увидим, что он
состоит из фреймов никак не связанных между собой. Получаются "автономные"
фреймы. В этом и сила, и слабость MP3.
При воспроизведении MP3-файла декодер просто берёт фрейм и развёртывает
его без оглядки на другие. Ему совершенно наплевать каким был
предыдущий фрейм, сколько их всего, какова должна быть их
последовательность и так далее - он только смотрит заголовок текущего
и развёртывает его на основе только этой информации из начала фрейма.
Считается, что это, во-многом, предопределило популярность этого формата.
Можно было качать из сети MP3-файл и тут же его слушать, хотя он ещё
полностью не загрузился; постоянный битрейт формировал битовый поток,
который, видимо, был удобен по разным техническим причинам.
В стандарте MP3 некоторые вещи очень чётко указаны. Например, при
вычислении длины фрейма в байтах получается не целое число. Как быть?
Это решается введением так называемых "байтов выравнивания", которые кодер
по своим правилам распределяет по всему файлу, чтобы обеспечить заявленный
битрейт, то есть сколько бит данных должно быть обработано за секунду. Также
стандарт требует, чтобы на протяжении всего файла сэмплрейт не менялся. А
вот битрейт может меняться. Поэтому мы пользуемся кроме постоянного, ещё
усреднённым и переменным битрейтами. Если плеер воспроизводит CBR, то ему
достаточно посмотреть заголовок только одного фрейма, размер аудиоданных
файла и он может вычислить продолжительность звучания, может точно
позиционироваться. А вот в случае VBR надо просмотреть все фреймы!! Если кто
помнит MNavigator, то я там писал про некорректную работу с VBR - просто
лень было всё отсматривать и вычислять...
Про качество кодеков не будем. Вот про теги нужно сказать. Итак, имелся
MP3-файл, состоящий из голых аудиоданных - просто цепочка фреймов. Один
человек захотел прикрепить к файлу инфу о названии песни, альбоме и так
далее. Записал нужную инфу в 128 байтов и приклеил к концу MP3-файла. Удачно
получилось, разработчики плееров сделали поддержку такого расположения
тегов. Затем 30 символов на поле не стало хватать, сделали тег плюс,
расположив его между аудиоданными и простым тегом в 128 байт. Этого тоже
вскоре оказалось недостаточным. Стали располагать инфу в начале MP3-файла. И
всё это народное творчество не противоречит формату MP3, так как декодер
умеет вычленять из потока битов фреймы, а всё остальное игнорирует! Обратим
внимание, что между фреймами пока никто ничего не располагает, хотя это тоже
не повредит проигрыванию MP3-файла. Это считается моветоном, такое вот
джентльменское соглашение. Вы можете вставить txt-файл "Война и мир"
Толстого внутри MP3-файла - и ничего не услышите, если там не встретится
область синхронизации (11 битовых единиц). А вот, если вставите в wav-файл,
то услышите этот роман в исполнении ЦАПа. Так что, если кто имеет тайны,
явки, пароли, счета в швейцарских банках, то можете спрятать их в
MP3-файлах.
Вот и всё, что знаю и что нам нужно знать для ответов на вопросы в
начале письма. Спецы-меломаны могут сказать, что в MP3 не всё так просто,
что всё происходит сложнее, что кодер перераспределяет свободные байты,
используются резервуары и так далее. Однако суть от этого не изменится, не
будем отвлекаться на детали.
Итак, теперь можем легко догадаться, что программы, режущие MP3-файлы,
скорее всего, режут их по границам фреймов. В этом случае никакие
аудиоданные не теряются, но куда деваются теги? Если MP3-файл окаймляли теги
и спереди и в конце, то при разбиении тег будет в начале первого куска и в
конце последнего. Всё зависит от программы - она может всё продублировать
для каждого куска, а может и нет. Кроме этого, вспомнив "байты
выравнивания", трудно сказать насколько "правильно приготовленными" будут
полученные куски. Если пройтись каким-нибудь спец. MP3-сканером, то может
обнаружится их недостача или избыток. Но это всё более-менее нормально.
А вот если резать Тотал Коммандером (а я знаю такие случаи), то в местах
разреза, скорее всего, фрейм повредится, верно? Вспомним, что
продолжительность фрейма несколько сотых долей секунды. То есть на слух это
не услышим, но это уже "грязная" работа, на концах таких кусков будут висеть
непонятные байты. Это тоже моветон и "неправильно приготовленный" MP3-файл.
Если же склеивать произвольные MP3-файлы Тоталом или батниками, то это
вообще абзац. Внутри файла могут оказаться "окаймляющие" теги, может
оказаться разный сэмплрейт! А это уже серьёзно - нарушение одного из базовых
требований стандарта MP3. Если плеер не заточен под тотальное сканирование
фреймов, то он будет ошибаться в позиционировании и продолжительности
звучания. Это уже будет не MP3. Если в борщ положить ещё и курятину,
макароны, бананы, то это будет "работать", то есть это будет съедобным,
питательным, но это уже будет не борщ.
Помните, говорил про силу и слабость MP3 - он, бедняга, будет
воспроизводиться, как бы над ним не измывались. Ему остаётся уповать только
на нашу добросовестность. Если хотите делать подкаст, выложить на публичное
обозрение, а не для личного пользования, то лучше "готовить" MP3-файлы
хорошими специализированными программами. Я упомянул лишь явные признаки
нарушения стандартов MP3, но есть и скрытые, которые легко выявляются.
Серьёзные аудиоредакторы обычно всегда разворачивают MP3 в wav,
обрабатывают, а потом опять в MP3. Так обеспечивается выполнение стандартов.
Да и напрямую, например, увеличить громкость, довольно сложная задачка.
Чтобы получить качественный продукт надо поиграться битрейтами,
сэмплрейтами, у всех всё индивидуально. Встречал MP3-файлы стерео, которые
при перекодировке в моно с не меньшими битрейтом и сэмплрейтом, резко теряли
в качестве звучания. Конвертация в joint решала проблему. Хотя в теории
такого быть не должно, но кодеры делают разные люди и по-разному...
Вот и всё, что хотел сказать. Каждый выбирает сам методы обработки
MP3-файлов, но может кого-то это письмо удержит от слишком смелых "решений".
Спасибо всем кто дочитал это письмо, спасибо мне, что его написал, спасибо
MP3 за то, что он у нас есть!
С н.п. Родион.
Всем доброго времени суток.
Хотя и не я начал эту тему,но всё-таки часто пользуюсь склеиванием
Mp3-файлов, И особенно,если,скачал какую-либо аудиокнигу без указания
дорожек или хочу разбить её по-своему. Там,полагаю,это особой роли не
играет. И для склеивания Mp3-файлов,на мой взгляд как нельзя лучше подходит
Total Commander.
Ну,а вообще-то,Родион,огромное вам спасибо за подробное и грамотное
разъяснение по этому вопросу.
Василий.