Флакон живого звука
Сергей ЯРЕМЧУК [email protected]
С тех пор, когда компьютер обрел достаточную мощь, чтобы можно было спокойно работать с мультимедиа-данными, истекло уже довольно много времени, по компьютерным меркам, конечно. За это время было разработано множество разнообразных форматов, спецификаций, стандартов, отличающихся как своим назначением, так и условиями распространения и лицензирования. Условно эти форматы можно разделить на две большие группы: форматы, осуществляющие кодирование аудио без потерь, и форматы, в которых изначально теряется часть избыточной информации в угоду меньшему размеру результирующего файла. Из первой группы наиболее популярен .wav, из второй — старичок .mp3, уже, впрочем, сдающий понемногу свои позиции более молодому, продвинутому и, на мой взгляд, намного лучшему Ogg Vorbis. Обычно большинство пользователей используют только эти форматы: .wav, чтобы сохранить оригинальное звучание, но в этом случае за качество приходится платить дисковым пространством, а .mp3 (.ogg) — просто для сбора коллекции, здесь дела обстоят с точностью до наоборот. Но оказывается, есть еще третья, эдакая золотая середина — форматы, обеспечивающие сжатие БЕЗ потери качества, причем насчитывается их уже около десятка. Об одном из них, по моему мнению, самом перспективном, мы и поговорим в данной статье. Имя ему 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, достаточно ввести команду без параметров с указанием только входного файла:
В ответ мы получим нечто в этом роде:
В результате в текущем каталоге образуется файл с таким же именем, но расширением .flac. Обратите внимание на строку options, которая показывает на действительно используемые опции кодирования. Получить краткую справку можно, введя просто flac, более подробную — с дополнительной опцией –help. По умолчанию используется уровень сжатия 5, который можно изменить, добавив -# (где # — цифры от 0 (быстрее) до 8 (лучше)):
Имя выходного файла можно задать явно, воспользовавшись ключом -о. Для декодирования файла flac используется ключ -d.
Протестировать имеющийся файл можно с помощью опции -t, а если хотите получить информацию о каждом фрейме, запустите утилиту с флагом -а для анализа. Это только основные опции; есть и другие, не менее полезные. Так, можно добавить опции для проверки, установить кодек, задать точки поиска, добавить комментарии и еще много чего. Все это добро можно посмотреть в очень подробной документации, идущей в комплекте. И — о, радость! — есть вариант на русском (спасибо Андрею Астафьеву).
Идем дальше. Утилита metaflac позволяет оперировать метаданными файла, проверить контрольную сумму, размер блока и фрейма (максимальный и минимальный), работать с тэгами в формате Ogg Vorbis.
А вот так можно скопировать тэг из файла .ogg и вставить его в .flac:
А теперь сопоставим данный формат с наиболее распространенными. Для теста использовалась композиция общей протяженностью 4 мин 48 сек. При кодировании во всех кодеках использовался режим по умолчанию как наиболее часто применяемый. При кодировании в mp3 использовался, по моему мнению, самый лучший кодек Lame, кодирование происходило с постоянным битрейтом (режим по умолчанию). Результат вы видите в таблице, он в особых комментариях не нуждается. Дополнительно я попытался как мог сравнить качество получившегося аудиофайла. Конечно, я признаю, что такое тестирование несет элемент субъективности и по всем правилам должно производится как можно большим количеством участников и «вслепую», дабы избежать предвзятости. Но ведь цели-то у меня совсем другие. Каким бы ни был хорошим кодек Lame, mp3 отдыхает даже по сравнению с Ogg Vorbis — такое ощущение, что недодали мощи и глубины, даже итоговый размер получился чуть больше .ogg. Единственное преимущество перед последним — скорость кодирования, почти вдвое большая. К слову, у меня ящик с трехсотым Целероном на борту, и под Windows с ее графическими утилитами на кодирование этого же файла уходит времени приблизительно на 50% больше. Ogg Vorbis обеспечивает хорошее, даже сказал бы, отличное звучание, и даже при таком низком битрейте практически не слышно отличий от оригинала, во всяком случае режущих слух. А вот FLAC, как и WAV, отличить от оригинала невозможно, зато первый, как видите, занимает объем ровно в два раза меньший (опять же по умолчанию, помните).
Теперь о том, на чем же все-таки его слушать. Как я уже говорил, доступны плагины для XMMS и WinAmp'a. При установке плагин libxmms-flac.so для XMMS автоматически должен скопироваться в каталог, где находятся плагины ввода XMMS (обычно /usr/lib/xmms/Input), если этого не произошло, то перекиньте его туда вручную. Теперь перезапустите XMMS. Как видно из Рис. 1 и 2, после этого он будет доступен в меню Свойства. В настройках можно даже изменять начальную кодировку ID-тэгов. При необходимости можно задать соответствие расширению в KDE (Рис. 3) для запуска XMMS.
Чтобы формат стал популярным, нужно не только его объявить, выставить на всеобщее обозрение и выпустить кучу проигрывателей. Нужно также убедить различных производителей железных плейеров в том, что следует выпускать устройства с поддержкой данного формата — только в этом случае он будет действительно популярным и востребованым. А вот с этим уже проблем нет. Поддержка FLAC была добавлена в Rio Receiver, Dell Digital Audio Receiver и в Phatnoise, которая стала первой коммерческой аппаратной платформой, поддерживающей FLAC. Для воспроизведения .flac-файлов плейером Phatbox выпущена соответствующая прошивка. Так что можно надеяться, что будущее у него все-таки есть. Что ж, пожелаем творческих успехов разработчикам, а нам — приятных минут за прослушиванием музыки.
Viva OpenSource!