http://www.izcity.com/cgi-bin/zip/g.plm/3774/izone431.zip FLAC-архиватор
FLAC (free lossless audio codec), т.е. свободный аудиокодек, обеспечивающий сжатие без потерь. 24 сентября 2002 года вышла последняя на данный момент версия 1.0.4; домашняя страница проекта —
http://www.sourceforge.net/projects/flac. FLAC относится к категории public domain, т.е. за разработчиками остается право устанавливать спецификации и сертифицировать продукты на совместимость. В общем-то, вот и все ограничения. Гарантируется, что ни сам формат, ни один из реализованных методов кодирования и раскодирования не запатентованы (и не будут в будущем), что позволяет без проблем использовать данный формат для любых целей, не боясь преследования. Исходные тексты библиотек доступны по лицензии LGPL, а утилиты и плагины — по GPL. Как видите, разработчики понимают, что на такого вида продукции заработать трудно, и пошли путем открытого формата, что, как показывают многочисленные примеры, благоприятно влияет на конечное качество продукта. FLAC распространяется для множества платформ: Unix (Linux, *BSD, Solaris), Windows, MacOS X, не забыты даже BeOS и OS/2.
Итак, FLAC сжимает файлы без потерь. При кодировании данных не происходит потери информации, поэтому и декодируемый аудиофайл абсолютно идентичен исходному. Формат разработан для сжатия аудиоданных (используется свойственный им высокий порядок корреляции между сэмплами), но так как алгоритм работы напоминает ZIP, а разработчики изначально не установили ограничений на вид исходных данных, то теоретически можно сжимать и любые другие данные — размер, правда, может не сильно отличаться от оригинального. Формат изначально задумывался как расширяемый поэтому возможно добавление новых возможностей без потери обратной совместимости. FLAC является потоковым форматом, это достигается разбиением данных на множество блоков, которые могут иметь разный размер, хотя имеющиеся кодеки используют блоки только постоянного размера. Так как каждый блок кодируется отдельно, то, изменяя размер блока при кодировании, можно добиться различной длины выходного файла — чем меньше размер блока, тем их, соответственно, больше, к тому же увеличивается объем служебной информации. Размер блока определяется в размере от 16 до 65535 сэмплов, что покрывает оптимальные размеры для всех возможных аудиоданных (музыка, речь). При этом каждый блок полностью независим от предыдущего. Чтобы определить возможные ошибки при передаче файла, для каждого фрейма (закодированного блока) вычисляется 16-битная контрольная сумма. Целостность на дальнейшем этапе подтверждается информацией о несжатых данных (MD5), которая находится в заголовке и может быть проверена при воспроизведении, декодировании или с помощью тестирования. К тому же кодер имеет режим работы, при котором кодируемые данные на лету декодируются и сравниваются с оригиналом; при наличии ошибок работа прекращается.
Разбитые на блоки данные передаются на стадию прогнозирования по одному подблоку. Каждый подблок кодируется в подфрейм независимо, а позже они объединяются во фрейм. Так как каждый канал кодируется отдельно, это означает, что один канал стерео-фрейма может сжиматься как постоянный подфрейм, а второй — как LPC-подфрейм. У каждого фрейма есть заголовок, состоящий из кода синхронизации, информации о фрейме (размер блока, частота дискретизации, количество каналов и т.п.) и восьмибитной контрольной суммы. Также в заголовке содержится либо номер первого сэмпла во фрейме относительно всего потока (для потоков с изменяющимся размером блока) или номер фрейма (для потоков с постоянным размером блока). Это позволяет производить быстрый и точный поиск. Далее следуют закодированные подфреймы (по одному на каждый канал) и, наконец, фрейм, дополненный нулями до границы байта. Каждый подфрейм имеет свой заголовок, определяющий способ его декодирования. Так как левый и правый каналы в большинстве случаев содержат часть одинаковой информации, то используется метод межканальной декорреляции, которая может быть четырех различных видов, а кодер подбирает его индивидуально для каждого фрейма:
1. Независимое. Левый и правый каналы кодируются независимо.
2. Разностное. Левый и правый канал преобразовываются в средний и остаточный каналы. Средний канал — это среднее значение левого и правого сигналов, а остаточный — разница между ними (левый минус правый).
3. Левостороннее. Кодируется левый и остаточный каналы.
4. Правоостороннее. Кодируется правый и остаточный каналы.
Для прогнозирования используются четыре различных метода моделирования входного сигнала (дословный, постоянный, постоянный линейный предиктор LPC и линейное прогнозирование FIR). Чем они отличаются, узнаете на сайте. И наконец, для кодирования остаточного (ошибочного) сигнала, доставшегося от стадии прогнозирования (который также необходимо учесть для того чтобы избежать потерь), используются два похожих метода с использованием кодов Райса. Причем эти методы не являются догмой — можно при желании использовать и свои методы кодирования. Более того, FLAC допускает изменение метода кодирования остатков от блока к блоку и даже в пределах канала в блоке. Одной из целей проекта являются низкие аппаратные требования, чтобы обеспечить декодирование в реальном времени даже на старых компьютерах. Кроме того, есть два пункта, которые разработчики не будут и не хотят реализовывать (если кто-то и собирается — пожалуйста, но совместимость с оригиналом в этом случае не гарантируется) — сжатие с потерями и реализация защиты от копирования в любом виде.
Итак, с особенностями немного разобрались, теперь давайте перейдем к практике. Все примеры привожу для платформы Linux, заинтересовавшиеся же пользователи других операционных систем все необходимые ссылки найдут на сайте. Поставка FLAC включает:
libFLAC, библиотеку для базовых кодеров и декодеров и интерфейса метаданных;
libFLAC++, объектную оболочку для libFLAC;
libOggFLAC и libOggFLAC++, обертки кодеров и декодеров libFLAC и libFLAC++, соответственно, для доступа к потокам FLAC в контейнере Ogg;
flac, утилиту командной строки, выполняющую сжатие и распаковку файлов .flac;
metaflac, утилиту командной строки для редактирования метаданных в файлах .flac.
Плюс ко всему в комплект входят плагины для различных проигрывателей (XMMS, WinAmp 2 и 3 версий) и библиотеки для работы с кодировками и ID-тэгами.
В первую очередь нас интересует утилита flac. Большинство параметров по умолчанию базового кодера оптимизированы для CD-аудио (т. е. 44.1 кГц, 2 канала, 16 бит на сэмпл), хотя, конечно, все это можно изменить, установив соответствующие опции.
В простейшем случае, для того чтобы закодировать wav-файл в flac, достаточно ввести команду без параметров с указанием только входного файла:
Код: [sergej@grinder sound]$ flac test.wav