Декодирование звука с учётом ReplayGain

2011.12.01

Технологию ReplayGain (выравнивание громкости звуковых файлов) придумали ещё в 2001 году, и с тех пор стало можно слушать музыку в режиме shuffle, не насилуя постоянно регулятор громкости.  Особенно это актуально для радиостанции, где резким перепадом можно доставить дискомфорт большому количеству ушей.

Технологию эту почти поддерживают почти все проигрыватели, и всё бы хорошо, но вот с юниксовыми утилитами, как выяснилось, есть проблемы.  В частности, проблемы у них возникают с вытаскиванием информации из файлов в формате MP3.  Это не удивительно: есть примерно десяток вариантов записи тэгов в эти файлы, попробуй разберись.

У нас на tmradio раньше использовался ices, в который я лично добавлял поддержку ReplayGain.  Но он давно не поддерживается и вместо него рекомендуют использовать ezstream, к которому подключаются внешние декодеры, с которыми он общается через потоки ввода-вывода.  Это действительно логично и удобно, только вот декодер осталось выбрать, а их тоже довольно много:

  • lame.  Единственный вариант для кодирования потока в MP3, причём умеет и декодировать файлы, поэтому кажется самым логичным вариантом.  Не поддерживает ReplayGain при декодировании, хотя умеет его считать.
  • sox.  Умеет почти всё, что можно придумать, но для работы с тэгами MP3 файлов использует библиотеку libmp3tag (из набора mad), которая поддерживает только самые базовые тэги: artist, title, genre, year итд.  Зато спокойно справляется со всеми остальными форматами.
  • madplay.  Его рекомендуют где-то в документации к ezstream.  Он поддерживает ReplayGain, но в какой-то своей собственной интерпретации, снижая громкость на фиксированные 6dB.  Объяснение этому даётся, но довольно мутное, зато результат вполне чёткий: MP3 файлы звучат сильно тише других.
  • mpg321.  Не поддерживает ReplayGain.
  • mpg123.  Поддерживает ReplayGain, причём и RVA, и REPLAYGAIN_XXX.

В итоге я использую mpg123 для декодирования MP3 файлов и sox для всех остальных.  Настройка кодеков в ezstream выглядит так:

<encdec>
    <format>MP3</format>
    <match>.mp3</match>
    <decode>mpg123 --rva-radio --stereo --rate 44100 --stdout "@T@"</decode>
    <encode>lame --preset cbr 128 -r -s 44.1 --bitwidth 16 — -</encode>
</encdec>
<encdec>
    <format>VORBIS</format>
    <match>.ogg</match>
    <decode>sox --replay-gain track "@T@" -r 44100 -c 2 -t raw -e signed-integer -</decode>
    <encode>oggenc -r -B 16 -C 2 -R 44100 --raw-endianness 0 -q 1.5 -t "@M@" -</encode>
</encdec>

Следить за развитием событий можно через RSS ленту или почтовую рассылку.