Balrogg пересжимает Vorbis и Opus без потерь: экономия до 12%

Balrogg пересжимает Vorbis и Opus без потерь: экономия до 12%

Balrogg, свободный (GNU GPL v3) консольный инструмент, который берёт уже закодированные аудиофайлы Ogg Vorbis и Opus и без потери единого бита пересжимает их в собственный, более компактный контейнер. По данным README проекта, архивы получаются в среднем на 8-12% меньше исходных .ogg-файлов и на 3-8% меньше исходных .opus-файлов. Обратиться по вопросам проекта предлагается к Камиле Шевчик (Kamila Szewczyk), она указана как контакт для багрепортов; чей ещё вклад стоит за проектом, из текста не следует.

Команда balrogg e файл.ogg файл.blr сжимает, balrogg d файл.blr файл.ogg, восстанавливает исходный файл обратно; кодек (Vorbis или Opus) определяется автоматически. Флаг -b включает пакетную обработку сразу нескольких файлов с использованием всех доступных ядер и памяти, при этом более крупные файлы обрабатываются первыми. Степень агрессивности сжатия задаётся ключами от -1 до -9 (по умолчанию -9): до уровня -4 включительно каждая ступень добавляет отдельную стадию модели остатка и меняет саму схему декодирования, а с -4 по -9 расширяется только перебор параметров при кодировании, скорость распаковки при этом не меняется.

Поддержка Opus в Balrogg ограничена: только один моно- или стереопоток с channel mapping family 0, пакеты (включая служебные OpusHead и OpusTags) не длиннее 61 440 байт; многоканальные и «сцепленные» (chained) Opus-файлы утилита отказывается обрабатывать вовсе. По умолчанию на процесс наложен лимит памяти в 2 ГиБ (защита от неоправданно больших аллокаций), его можно изменить или отключить переменной окружения BLR_MEMCAP. Формат архивов .blr пока не гарантирует совместимости версий вперёд или назад, стабильность обещана только начиная с релиза v2.0.

Энкодер устроен консервативно: он отказывается кодировать файл, который не может воспроизвести побайтово точно, например, при битых контрольных суммах, некорректной последовательности страниц, неподдерживаемых особенностях Vorbis или отсутствии финальной end-of-stream страницы; в таком случае Balrogg выводит диагностическое сообщение и завершается с кодом 1 (в пакетном режиме возвращается наибольший из ненулевых кодов по всем файлам). Каждый файл кодируется и декодируется одним потоком и требует доступных для позиционирования (seekable) файлов ввода и вывода. Проект собирается из исходников на C99 (./configure && make && sudo make install, из git-репозитория предварительно нужно выполнить ./bootstrap) и, помимо обычного Linux/Unix, поддерживает кросс-сборку под Windows через MinGW, отдельную сборку под Windows 95 с урезанным рантаймом KERNEL32 для процессоров i486, а также сборку под MS-DOS через DJGPP с DPMI-хостом вроде CWSDPMI.

Ключевые факты

  • Balrogg без потерь пересжимает готовые файлы Ogg Vorbis и Opus в собственный контейнер: архивы получаются на 8-12% меньше исходных .ogg и на 3-8% меньше исходных .opus
  • Лицензия GNU GPL v3; формат .blr пока не гарантирует совместимости между версиями вперёд/назад, это обещано только с релиза v2.0
  • Степень сжатия задаётся ключами -1..-9 (по умолчанию -9); до уровня -4 каждая ступень меняет саму схему декодирования, дальше растёт только перебор параметров кодирования, а скорость распаковки не меняется
  • Opus поддержан частично: только один моно/стереопоток с channel mapping family 0, пакеты до 61 440 байт, многоканальные и chained-файлы отклоняются
  • Энкодер отказывается от файла, если не может воспроизвести его побайтово точно (битые контрольные суммы, повреждённые страницы, отсутствие финальной EOS-страницы), тогда просто возвращает код ошибки 1, ничего не портя

Почему это важно

Это нишевый, но добротно сделанный инженерный проект: свободный кросс-платформенный инструмент, который выжимает из уже сжатых lossy-форматов Vorbis и Opus ещё 3-12% места без потери единого бита исходного звука. На больших аудиоархивах и коллекциях музыки такая экономия ощутима, а сам факт, что это вообще возможно без потерь, интересен технически.

Кому это важно

Разработчикам и администраторам, которые хранят крупные библиотеки Ogg/Opus-аудио, подкасты, музыкальные архивы, встроенные звуковые ассеты игр, и хотят сократить объём хранения без перекодирования и без потери качества. Полезно и авторам дистрибутивов/пакетов: инструмент открытый, собирается из исходников под несколько платформ.

Как это применить

Утилиту можно поставить из пакетного менеджера или скачать бинарник с GitHub Releases, либо собрать самому (./configure && make && sudo make install; при сборке из git-репозитория сначала ./bootstrap). Базовая команда: balrogg e файл.ogg файл.blr для сжатия, balrogg d файл.blr файл.ogg, для восстановления; флаг -b включает пакетную обработку сразу нескольких файлов. Стоит помнить, что формат .blr пока не стабилен между версиями программы (это обещано только с v2.0), поэтому до тех пор не имеет смысла хранить такие архивы как единственную копию файла.

Можно ли доверять

Проект открытый (GNU GPL v3), исходный код и история изменений публичны на GitHub, а сам энкодер спроектирован осторожно: он отказывается обрабатывать файл, если не может гарантированно восстановить его побайтово точно, и в этом случае просто возвращает код ошибки, а не портит данные. Насколько заявленная экономия места (8-12% для Vorbis, 3-8% для Opus) подтверждается независимыми тестами за пределами README самого проекта, по доступному тексту судить нельзя.

Риски и подводные камни

Формат .blr не гарантирует совместимости вперёд или назад до выхода v2.0, обновление программы может сделать ранее созданные архивы нечитаемыми, так что на этом этапе это плохой вариант для долгосрочного хранения без сохранения оригиналов. Поддержка Opus заметно урезана: только один моно- или стереопоток с channel mapping family 0, пакеты не длиннее 61 440 байт, многоканальные и chained-файлы отклоняются целиком. Кодирование и декодирование однопоточные для каждого файла и требуют seekable ввода-вывода, для потоковой обработки или очень больших коллекций понадобится собственная обвязка поверх пакетного режима.