Декодирование звука с учётом ReplayGain
Технологию 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 ленту или почтовую рассылку.