Кодируем mp3 в Linux

debianeach

Опубликован:  2019-03-12T12:01:20.456942Z
Отредактирован:  2019-03-14T12:14:17.774578Z

Поговорим о некоторых прикладных задачах для десктопа на каждый день. Этот обзор открывает серию статей посвященных работе с мультимедиа в Debian buster и других версиях популярных операционных систем с ядром Linux, и поговорим мы в нём о популярном формате хранения аудио-данных - mp3, разберёмся, как с ним работать, что для этого нужно и с какими сложностями при этом можно столкнуться.

mp3 - устаревший формат хранения аудио-данных, но до настоящего времени остаётся очень популярным, наверно самым популярным форматом за счёт хорошей поддержки производителями бытовой электроники. Сегодня купить устройство умеющее декодировать и воспроизводить mp3 файлы можно в любом ларьке, это несомненный плюс. Самая популярная программа для кодирования mp3 на сегодняшний день - это lame, она же даёт наилучшие результаты в секторе mp3, подтверждено слепыми прослушиваниями. В Debian buster эта программа имеется в официальном репозитории и доступна для установки при помощи пакетного менеджера.

sudo apt install lame

Чтобы получить mp3-файл, понадобится исходный файл, на входе lame принимает как WAV-файлы, так и сырой поток PCM. В рамках этого обзора я буду кодировать WAV-файл и сжатые файлы в формате FLAC - наиболее часто встречающаяся задача в современных реалиях. Параметры исходного WAV-файла можно посмотреть при помощи программы mediainfo, которая тоже имеется в официальном репозитории.

CjFQ1dDWf5.png

На снимке экрана выше показан выхлоп mediainfo для моего исходного файла, следует обратить внимание на характерные параметры:

  • Sampling rate 44.1 kHz;
  • Bit depth 16 bits;
  • Duration 3 min 31 s;
  • Stream size 35.6 MiB.

Основная проблема хранения аудио-данных - это требуемое для хранение дисковое пространство, и как видно из выхлопа mediainfo, формат хранения WAV очень неэффективен по этому параметру, на три с половиной минуты звучания файл занял 35.6 MiB дискового пространства. Исходный файл представляет из себя CDDA-рип.

В командной строке lame имеет следующую форму ввода команды:

lame [options] <infile> [outfile]

При этом опции и имя исходящего файла не являются обязательными, тогда как входящий файл должен быть задан. Если имя исходящего файла не будет задано, то энкодер создаст файл с именем исходного файла и расширением .mp3.

Опции кодирования lame обычно провоцирую бурю эмоций и безудержный флейм в публичных обсуждениях на тематических форумах, но в сущности не являются чем-то особенным и сверхъестественным. При работе с этим энкодером важно понимать только одну характерную особенность: lame имеет три режима кодирования, а именно - cbr, vbr и abr.

Режим кодирования cbr (constant bitrate) на выходе даёт файлы с постоянным битрейтом и поэтому такие файлы при прочих равных занимают большее дисковое пространство относительно файлов полученных в режимах vbr (variable bitrate) и abr (average bitrate). Последний из упомянутых режимов является частным случаем переменного битрейта и на практике используется крайне редко, поэтому на нём я останавливаться не буду, а покажу кодирование своего исходного WAV-файла в формат mp3 в двух режимах: cbr и vbr.

Режим кодирования и параметры создаваемого файла определяются опциями lame, за режим постоянного битрейта отвечает ключ -b с числовым параметром, обозначающим величину битрейта. lame определяет следующий ряд допустимых битрейтов: 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320.

На низких битрейтах mp3 даёт слишком низкое качество воспроизведения, и битрейты ниже 128 я бы не рекомендовал использовать вообще. На максимальном битрейте mp3 звучит практически неотличимо от исходных файлов, и чтобы услышать разницу нужно иметь отличный слух и аппаратуру воспроизведения достаточно высокого класса.

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

lame -b 320 --noreplaygain --lowpass -1 05.wav

BVCrywV06p.png

Выхлоп консоли при кодировании mp3 с помощью lame наблюдать в реальном времени достаточно увлекательно, особенно при кодировании с переменном битрейтом.

lame -V 0 --noreplaygain --lowpass -1 05.wav 05-vbr.mp3

9wv8ugeGXW.png

На снимке экрана выше видно, что при кодировании в режиме переменного битрейта lame разделил все фреймы созданного файла на ряд стандартных битрейтов и показал количество фремов для каждого конкретного битрейта в ряду. Таким образом можно вполне резонно сделать вывод, что у mp3 нет полноценного переменного битрейта.

В результате выполнения этих двух команд в моём текущем каталоге появились два новых файла, взглянем на их размер в МиБ.

65OMSYySaO.png

Наглядная демонстрация экономии дискового пространства, 9 МиБ на постоянном битрейте и 7 МиБ на переменном выглядят достаточно заманчиво относительно 36 МиБ исходного файла. При этом переменный битрейт, что характерно, обеспечивает лучшее сжатие. Но mp3 - это формат, который вносит существенные искажения, а декодированный из них звуковой поток имеет существенные потери относительно исходного WAV-файла. В рамках текстового блога степень деградации данных можно приблизительно оценить демонстрацией так называемых спектров. В порядке следования:

HyMzQbZvdN.png

1kzll8qfvz.png

4pHtSlW0Jb.png

Разглядывание спектров - не очень блестящая идея, и музыку следует слушать ушами, но тем не менее приблизительно деградацию данных спектры великолепно демонстрируют, и чем выше сжатие, тем больше потери, тем сильнее деградация данных относительно исходника. На максимальных битрейтах mp3 демонстрирует неплохое соотношение размера и качества звучания, но файлы получаются всё же большие для мобильных устройств.

С кодированием mp3 есть ещё пара проблем, на которых следует остановиться чуть более подробно. Первая проблема - это формат исходного материала, который подлежит кодированию. Дело в том, что lame на входе нужен поток PCM, не важно, заключён он в файле или нет. Но на практике исходным материалом чаще всего будут CDDA-рипы, скачанные с различных торрент-трекеров, различных форматов: FLAC, APE, WAVPACK etc. Посмотрим, как можно получить mp3 файлы из обычного потрекового рипа в формате FLAC одной единственной командой в консоли. Для примера у меня есть исходный первый попавшийся на рутрекере рип, в консоли он выглядит так:

wE9bbkkiFg.png

Потрековый CDDA-рип - это обычно группа файлов в формате FLAC и текстовый CUE-файл с метаданными. FLAC-файлы можно достаточно просто перекодировать в mp3 при помощи одного из инструментов shntool. Пакет shntool доступен в официальном репозитории Debian buster и может быть установлен при помощи пакетного менеджера.

sudo apt install shntool

В составе shntool есть режим conv, который довольно просто позволит достичь желаемого и конвертирует все FLAC-файлы в текущем каталоге одной единственной командой.

shnconv -o 'cust ext=mp3 lame -b 320 --noreplaygain --lowpass -1 - %f' *.flac

TwooG8KXO2.png

В итоге я получил в текущем каталоге дополнительно 10 файлов mp3. Если взглянуть на эти файлы чуть-чуть более пристально, то можно увидеть, что все они не содержат метаданных. Посмотреть метаданные mp3 в командной строке можно при помощи программы eyed3, она тоже есть в официальном репозитории и может быть установлена при помощи пакетного менеджера. Я покажу метаданные только первого файла mp3.

eyeD3 01*.mp3

EG1GH6HTwm.png

Метаданных в файле нет. Это и есть вторая проблема характерная именно для кодирования в формат mp3, необходимо как-то заполнить метаданные треков. К решению этой проблемы есть два подхода. Первый подход предполагает ручное заполнение метаданных mp3 треков с помощью любой из доступных в Debian buster специализированных программ, например - kid3 или puddletag.

z9FLqgUeOW.png

WIDrJC22Ak.png

Второй подход предполагает использование CUE-файла, мой исходный CDDA-рип содержит такой файл, поэтому метаданные треков можно очень просто перенести из CUE-файла в файлы mp3, для этого мне понадобится утилита cue2tags из пакета cuetoolkit. К сожалению, в официальном репозитории Debian buster этого пакета нет, но его можно достаточно просто установить, как это делается, я расскажу в одном из ближайших выпусков. При наличии cue2tags и CUE-файла заполнение метаданных треков сводится опять к одной единственной команде.

cue2tags -m mp3 7+1.cue

HC6OPyFfpZ.png

После этого все файлы mp3 будут иметь метаданные CUE-файла.

wvVQfoIThx.png

Учитывая, что результат достигнут одной командой, можно считать, что программа достойна метки must have.

Подведу небольшой итог: кодирование mp3 в Linux - задача элементарная, и решается штатными средствами на раз-два даже в терминале. Кроме продемонстрированных в этом описании программ официальный репозиторий Debian buster имеет много других интересных программ для работы с mp3, и некоторым из них, возможно, я посвящу отдельную статью блога в перспективе. А на сегодня всё..! С нетерпением жду ваших вопросов и комментариев, комментарии открыты всем желающим, достаточно зарегистрироваться и авторизоваться на сайте.

Комментарии: