Формат сжатия FLAC

7 Фев
2008

С тех пор, когда компьютер обрел достаточные мощности, чтобы можно было спокойно работать с мультимедиа данными прошел уже довольно большой промежуток времени, по компьютерным меркам конечно. За это время было разработано множество разнообразных форматов, спецификаций, стандартов. Отличающихся как своим назначением, так и условиями распространения и лицензирования. Условно эти форматы можно разделить на две большие группы: форматы осуществляющие кодирование аудио без потерь и форматы в которых изначально теряется часть избыточной информации в угоду меньшему размеру результирующего файла.

В первой группе наиболее популярным является wav, во второй – старичок mp3, хотя уже сдающий понемногу свои позиции более молодому и продвинутому и на мой взгляд намного лучшему Ogg Vorbis. Обычно большинство пользователей используют только эти форматы: wav чтобы сохранить оригинальное звучание, но в этом случае за качество приходится платить дисковым пространством, а mp3 (ogg) просто для сбора коллекции, в этом случае ситуация с точностью на оборот. Но оказывается есть еще третья “золотая ” середина — форматы обеспечивающие сжатие БЕЗ потери качества и при чем насчитывается их уже около десятка. Об одном из них, по моему мнению, самом перспективном мы и поговорим в данной статье. Имя ему FLAC (free lossless audio codec) т.е. свободный аудиокодек, обеспечивающий сжатие без потерь домашняя страница проекта http://www.sourceforge.net/projects/flac/. Итак начнем, пожалуй с условий лицензирования. FLAC относится к категории public domain т.е. за разработчиками остается право устанавливать спецификации и сертифицировать продукты на совместимость. Вот и все в принципе ограничения. Гарантируется, что ни сам формат, ни один из реализованных методов кодирования и раскодирования не запатентованы (и не будут в будущем), что позволяет без проблем использовать данный формат для любых целей не боясь преследования. Исходные тексты библиотек доступны по лицензии LGPL, а утилиты и плагины по GPL. Как видите разработчики понимают, что на такого вида продукции заработать трудно и пошли путем открытого формата, что как показывают многочисленные примеры благоприятно влияют на конечное качество продукта. FLAC распространяется для множества платформ: Unix (Linux, *BSD, Solaris), Windows, Mac OS X и не забыты даже BeOS и OS/2.

Итак, FLAC сжимает файлы без потерь. При кодировании данных не происходит потеря информации, поэтому и декодируемый аудиофайл абсолютно идентичен исходному. Формат разработан для сжатия аудиоданных (используется то что аудиоданные имеют высокий порядок корреляции между сэмплами.), но так как алгоритм работы напоминает zip и разработчики изначально не вложили ограничений на вид исходных данных, то теоретически можно сжимать и любые другие данные, но размер правда может не сильно отличаться от оригинального. Формат изначально задумывался как расширяемый поэтому возможно добавление новых возможностей без потери обратной совместимости. FLAC является потоковым форматом, что достигается разбиением данных на множество блоков, которые могут иметь разный размер, хотя имеющиеся кодеки используют блоки только постоянного размера. Так как каждый блок кодируется отдельно, то изменяя размер блока при кодировании можно добиться различной длины выходного файла т.к. чем меньше размер блока тем их соответственно больше и увеличивается количество служебной информации. Размер блока определяется от 16 до 65535 семплов, что покрывает оптимальные размеры для всех возможных аудиоданных (музыка, речь). При этом каждый блок полностью не зависим от предыдущего. Чтобы определить возможные ошибки при передаче файла, для каждого фрейма (закодированного блока) вычисляется 16-битная контрольная сумма. Целостность на дальнейшем этапе подтверждается подписью MD5 несжатых данных, которая находится в заголовке и может быть проверена при воспроизведении, декодировании или с помощью тестирования. К тому же кодер имеет режим работы, при котором кодируемые данные на лету декодируются и сравниваются с оригиналом при наличии ошибок работа прекращается. Разбитые на блоки данные передаются на стадию прогнозирования по одному подблоку. Каждый подблок кодируется в подфрейм независимо, а позже они объединяются во фрейм. Так как каждый канал кодируется отдельно, это означает, что один канал стерео фрейма может сжиматься как постоянный подфрейм, а второй как LPC подфрейм. У каждого фрейма есть заголовок, состоящий из кода синхронизации, информации о фрейме (размер блока, частота дискретизации, количество каналов и т.п.) и восьмибитной контрольной суммы. Также в заголовке содержится либо номер первого сэмпла во фрейме относительно всего потока (для потоков с изменяющимся размером блока) или номер фрейма (для потоков с постоянным размером блока). Это позволяет производить быстрый и точный поиск. Далее следуют закодированные подфреймы (по одному на каждый канал) и, наконец, фрейм, дополненный нулями до границы байта. Каждый подфрейм имеет свой заголовок, определяющий способ его декодирования. Так как левый и правый каналы в большинстве случаев содержать часть одинаковой информации, то используется метод межканальной декорреляции, которая может быть четырех различных видов, а кодер подбирает его индивидуально для каждого фрейма:

  • Независимое. Левый и правый каналы кодируются независимо.
  • Разностное. Левый и правый канал преобразовываются в средний и остаточный каналы. Средний канал — это среднее значение левого и правого сигналов, а остаточный — разница между ними (левый минус правый).
  • Левостороннее. Кодируется левый и остаточный каналы.
  • Правоостороннее. Кодируется правый и остаточный каналы.

Для прогнозирования используются четыре различных метода моделирования входного сигнала (дословный, постоянный, постоянный линейный предиктор LPC и линейное прогнозирование FIR). Чем они отличаются, смотрите на сайте. И, наконец для кодирования остаточного (ошибочного) сигнала доставшегося от стадии прогнозирования (который также необходимо учесть для того чтобы избежать потерь) используются два похожих метода с использованием кодов Райса. Причем эти методы не являются догмой можно при желании использовать и свои методы кодирования. Более того, FLAC допускает изменение метода кодирования остатков от блока к блоку и даже в пределах канала в блоке. Одной из целей проекта являются низкие аппаратные требования, чтобы обеспечить декодирование в реальном времени даже на старых компьютерах. Кроме этого есть два пункта которые разработчики не будут и не хотят реализовывать (хотя если кто то и собирается, то пожалуйста, но совместимость с оригиналом в этом случае не гарантируется). Это сжатие с потерями и реализация защиты от копирования в любом виде.

Итак, с особенностями немного разобрались, теперь давайте перейдем к практике. Все примеры привожу для платформы Linux, но для заинтересовавшихся пользователей других операционных систем все необходимые ссылки найдете на сайте. Поставка FLAC включает:

libFLAC, библиотеку для базовых кодеров и декодеров и интерфейса метаданных;

libFLAC++, объектную оболочку для libFLAC;

libOggFLAC и libOggFLAC++, обертки кодеров и декодеров libFLAC и libFLAC++, соответственно, для доступа к потокам FLAC в контейнере Ogg;

flac, утилиту командной строки, выполняющую сжатие и распаковку файлов .flac;

metaflac, утилиту командной строки для редактирования метаданных в файлах .flac;

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

В первую очередь нас интересует утилита flac, большинство параметров по умолчанию базового кодера оптимизированы для CD-аудио (т.е. 44.1кГц, 2 канала, 16 бит на сэмпл), хотя конечно все это конечно можно изменить, установив соответствующие опции.

В простейшем случае, для того чтобы закодировать wav файл в flac достаточно ввести команду без параметров с указанием только входного файла.
[sergej@grinder sound]$ flac test.wav

options: -P- -b 4608 -m -l 8 -q 0 -r 3,3
teat.wav: wrote 29986315 bytes, ratio=0,589

В результате в текущем каталоге образуется файл с таким же именем, но расширением .flac. Обратите внимание на строку options которая показывает на действительно используемые опции кодирования. Получить краткую справку можно введя просто flac, более подробную с дополнительной опцией –help. По умолчанию используется уровень сжатия 5, который можно изменить добавив -# (где # цифры от 0 (быстрее) до 8 (лучше)).

[sergej@grinder sound]$ flac -8 test.wav

Имя выходного файла можно задать явно воспользовавшись ключом . Для декодирования файла flac используется ключ -d.

[sergej@grinder sound]$ flac -d test.flac

Протестировать имеющийся файл можно с помощью опции -t, а для тех кто хочет получить информацию о каждом фрейме запустите утилиту с опцией для анализа. Это основные опции с помощью остальных с исходным файлом можно проделать если не все то многое. Так можно добавить опции для проверки, установить кодек, задать точки поиска, добавить комментарии и еще много всего. Все их можно посмотреть в очень подробной документации идущей в комплекте.

Утилита metaflac позволяет оперировать метаданными файла, проверить контрольную сумму, размер блока и фрейма (максимальный и минимальный), работать с тегами в формате Ogg Vorbis.

[sergej@grinder flac]$ metaflac —show-md5sum —show-min-framesize —show-sample-rate —show-total-samples test.flac

01762464f61bdf7ef35f268cf6f6e80a # MD5 сумма

16 # минимальный размер фрейма

44100 # скорость дискретизации

12723732 # общее количество семплов

А вот так можно скопировать тег из файла ogg и вставить его в flac.

[sergej@grinder flac]$ vorbiscomment -l —raw file.ogg | metaflac —import-vc-from=- —no-utf8-convert file.flac

Хотелось бы немного сравнить данный формат с наиболее распространенными. Для теста использовалась композиция общей протяженность 4 мин 48 сек. При кодировании во всех кодеках использовался режим по-умолчанию, как наиболее часто применяемый. При кодировании mp3 использовался по моему мнению самый лучший кодек Lame, кодирование происходило с постоянным битрейтом (режим по-умолчанию). Результат вы видите в таблице, он в особых комментариях не нуждается.

Формат    Получившийся размер выходного файла, Мб  Скорость кодирования.

WAV                                            48.5                                   -

Mp3 (LAME 128 кб\с)             4.4                              2 мин

Ogg ср. 112 кб\с                       3.9                               4.08мин

FLAC                                            28.6                         0.48 мин

 

Дополнительно я попытался, как мог сравнить качество получившегося аудиофайла. Конечно, я признаю, что такое тестирование несет элемент субъективности и по всем правилам должно производится как можно большим количеством участников и в «слепую», иначе тестирующий уже заранее «знает» о недостатках. Так что это все мое личное мнение, да и не добивался, если честно кристально чистого эксперимента. Цели ведь совсем другие. Так вот какой бы ни был хороший кодек Lame, mp3 отдыхает даже по сравнению с Ogg Vorbis, такое ощущение, что недодали мощи и глубины, даже итоговый размер получился чуть больше ogg, но выиграл в скорости кодирования у последнего почти вдвое. К слову у меня ящик с трехсотым Целероном на борту и под Windows с ее графическими утилитами на кодирование этого же файла уходит времени приблизительно на 50 процентов больше. Ogg Vorbis понравился хорошим даже сказал бы отличным звучанием и даже при таком низком битрейте практически не слышно отличий во всяком случае режущих слух. А вот FLAC как и wav отличить от оригинала невозможно, но первый как видите занимает объем ровно в два раза меньший (опять же по-умолчанию, помните). Так что для тех, кому необходимо оригинальное звучание и при этом есть желание сэкономить место на диске FLAC и будет как раз тем, что доктор прописал. Теперь чем же все-таки его слушать. Как я говорил, доступны плагины для многих проигрывателей. a.

Вот и все. Viva OpenSource!

Комментировать

Наверх