FLAC: формат

Формат

Здесь приведено полное описание формата FLAC.

От автора

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

--Джош Колсон

Область применения

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

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

Архитектура

Подобно большинству программ такого рода, кодер FLAC выполняет следующие действия:

В дополнение ко всему определена система метаданных, позволяющая добавлять в начало потока произвольную информацию.

Определения

Многие термины, такие как "блок" и "фрейм", имеют различное значение в схемах кодирования. Например, фрейм в mp3 сооветствует многим сэмплам во всех каналах, в то время как фрейм S/PDIF представляет только один сэмпл для каждого канала. Обратите внимание на то, что, говоря о "блоках" и "подблоках", мы ссылаемся на незакодированные аудиоданные, а термины "фрейм" и "подфрейм" используем для данных сжатых FLAC.

Разбиение на блоки

Размер блоков сильно влияет на уровень сжатия. Если размер блока будет слишком мал, то в итоге получится очень много фреймов, а это значит, что на заголовки будет потрачено много битов. Если же размер блока большой, а характеристики сигнала сильно варьируются, кодер не сможет найти хороший предиктор. Чтобы упростить кодек, FLAC определяет минимальный размер блока в 16 сэмплов, а максимальный в 65535 сэмплов. Этот интервал покрывает оптимальные размеры блоков для всех аудиоданных, поддерживаемых FLAC.

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

Разбитые на блоки данные передаются на стадию прогнозирования по одному подблоку. Каждый подблок кодируется в подфрейм независимо, а позже они объендиняются во фрейм. Так как каждый канал кодируется отдельно, это означает, что один канал стерео фрейма может сжиматься как постоянный подфрейм, а второй как LPC подфрейм.

Межканальная декорреляция

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

Оказывается, что левостороннее и правостороннее кодирование могут быть более эффективными во многих фреймах, несмотря на то, что необходимое для оригинального сигнала количество битов на сэмпл немного больше, чем для независимого или усредненного кодирования.

Прогнозирование

FLAC использует четыре метода для моделирования входного сигнала:

Кодирование остатков

Для кодирования остаточного сигнала от стадии прогнозирования FLAC использует два похожих метода. Остаточный сигнал сжимается с использованием кодов Райса следующими способами:

  1. Кодер оценивает одиночный параметр Райса, основанный на разнице остатка и кодов Райса. Весь остаток кодируется с использованием этого параметра.
  2. Остаток делится на несколько интервалов одинаковой длины и каждый из них кодируется со своим параметром Райса, основанным на среднем значении для данного интервала.

Обратите внимание на то, что первый метод является частным случаем второго с одним интервалом. Отличие состоит в том, что в первом методе параметр Райса вычисляется для разницы остатка, а не для среднего значения.

В формате FLAC зарезервировано место для других методов кодирования. Кто-нибудь может попытаться найти лучшее контекстное моделирование параметра Райса или кодирования Хаффмана. Описания нескольких универсальных кодов можно найти на страницах LOCO-I и pucrunch.

Формат

В этом разделе описывается формат файла. Формат FLAC не предусматривает поля для номера версии, однако содержит несколько зарезервированных позиций. Последующие версии смогут использовать это место без нарушения совместимости с предыдущими версиями. Более старые версии декодеров могут либо прекращать работу, либо пропускать данные, закодированные новыми методами. Кроме того зарезервированы некоторые специальные значения, которые не могут появиться ни в одной из версий формата. Это обычно делается для улучшения механизма синхронизации.

Все числа в формате FLAC являются целыми, младший байт которых записывается вначале (big-endian). Числа являются беззнаковыми, кроме тех случаев, где явно указано обратное.

К потоку FLAC могут быть добавлены тэги ID3v1 (в конце) и ID3v2 (в начале). Эти данные не относятся к формату, однако декодер умеет пропускать их.

Перед полным описанием формата приведем его краткий обзор.

В таблице приведено формальное описание формата FLAC. Числа в угловых скобках показывают количество битов, используемых данным полем.

ПОТОК
<32> "fLaC", маркер потока FLAC в кодировке ASCII, означающий, что первыми четырьмя байтами потока являются 0x66, 0x4C, 0x61, 0x43
БЛОК_МЕТАДАННЫХ Обязательный блок метаданных STREAMINFO, содержащий основные свойства потока
БЛОК_МЕТАДАННЫХ* Ноль или больше блоков метаданных
ФРЕЙМ+ Один или больше аудиофреймов

БЛОК_МЕТАДАННЫХ
ЗАГОЛОВОК_БЛОКА_МЕТАДАННЫХ Заголовок, определяющий тип и размер блока метаданных
СОДЕРЖИМОЕ_БЛОКА_МЕТАДАННЫХ  

ЗАГОЛОВОК_БЛОКА_МЕТАДАННЫХ
<1> Флаг равный 1, если данный блок метаданных является последним перед аудиоблоками, 0 в противном случае
<7> Тип блока:
  • 0 : STREAMINFO
  • 1 : PADDING
  • 2 : APPLICATION
  • 3 : SEEKTABLE
  • 4 : VORBIS_COMMENT
  • 5 : CUESHEET
  • 6-127 : зарезервированы
<24> Длина в байтах соответствующего блока метаданных (не включает размер ЗАГОЛОВКА_БЛОКА_МЕТАДАННЫХ)

СОДЕРЖИМОЕ_БЛОКА_МЕТАДАННЫХ
БЛОК_МЕТАДАННЫХ_STREAMINFO || БЛОК_МЕТАДАННЫХ_PADDING || БЛОК_МЕТАДАННЫХ_APPLICATION || БЛОК_МЕТАДАННЫХ_SEEKTABLE || БЛОК_МЕТАДАННЫХ_VORBIS_COMMENT || METADATA_BLOCK_CUESHEET Содержимое блока должно соответствовать типу блока, указанному в заголовке

БЛОК_МЕТАДАННЫХ_STREAMINFO
<16> Минимальный размер блока в сэмплах в данном потоке.
<16> Максимальный размер блока в сэмплах в данном потоке.
<24> Минимальный размер фрейма в байтах в данном потоке. Если значение не известно, то 0
<24> Максимальный размер фрейма в байтах в данном потоке. Если значение не известно, то 0
<20> Частота дискретизации в Гц.
<3> (Количество каналов) - 1. FLAC поддерживает от 1 до 8 каналов.
<5> (Количество битов на сэмпл) - 1. FLAC поддерживает от 1 до 32 битов на сэмпл. Сейчас базовые декодер и кодер поддерживают до 24 бит на сэмпл.
<36> Количество сэмплов в потоке. Если здесь указан 0, то количество сэмплов не известно.
<128> Подпись MD5 несжатых аудиоданных, которая позволяет декодеру обнаружить ошибку, даже если ее наличие не нарушает структуру потока.
  Примечания:
  • Во FLAC определен минимальный размер блока в 16 сэмплов и максимальный размер - 65535. Это значит, что значения от 0 до 15 в соответствующих полях являются ошибочными.

БЛОК_МЕТАДАННЫХ_PADDING
n бит со значением 0. n должно быть кратно 8.

БЛОК_МЕТАДАННЫХ_APPLICATION
<32> Зарегистрированный id приложения (см. страницу регистрации)
Данные приложения. n должно быть кратно 8.

БЛОК_МЕТАДАННЫХ_SEEKTABLE
SEEKPOINT+ Одна или больше точек поиска.
  Примечания:
  • Количество точек поиска определяется в поле заголовка блока метаданных "длина" и равно длина / 18.

БЛОК_МЕТАДАННЫХ_SEEKPOINT
<64> Номер сэмпла в потоке первого сэмпла целевого фрейма или 0xFFFFFFFFFFFFFFFF для зарезервированной точки.
<64> Смещение в байтах от первого байта первого заголовка фрейма до первого байта заголовка целевого фрейма.
<16> Количество сэмплов в целевом фрейме.
  Примечания:
  • Для зарезервированных точек значения второго и третьего поля не определены.
  • Точки поиска должны быть отсортированы в таблице по возрастанию номера сэмпла.
  • Поля, содержащие номера первых сэмплов в целевом фрейме, должны быть уникальны для всех точек, за исключением зарезервированных.
  • Из двух предыдущих замечаний следует, что зарезервированных точек может быть любое количество, но они должны располагаться в конце таблицы.

БЛОК_МЕТАДАННЫХ_VORBIS_COMMENT
Содержимое комметария в формате Vorbis, как оно описано здесь. Обратите внимание на то, что спецификация Vorbis ограничивает размер этого блока 2 ^ 64 байтами, в то время как блок метаданных FLAC может иметь размер не больше 2 ^ 24 байтов. В соответствии со спецификацией Vorbis 32-битные данные, записанные в прямом порядке, в отличие от целых, записанных в обратном порядке, используемых в остальных частях FLAC.

БЛОК_МЕТАДАННЫХ_CUESHEET
<128*8> Номер в мультимедийном каталоге, в котором используются только символы ASCII из диапазона 0x20-0x7e. В общем случае этот номер может иметь размер от 0 до 128 байтов, а символы справа, оставшиеся неиспользованными, должны быть заполнены байтом 0x00. На аудиодисках номер состоит из 13 цифр, за которыми следуют 115 пустых символов.
<64> Количество начальных сэмплов. Это поле имеет значение только для оглавлений аудиодисков, для остальных целей должно быть установлено значение 0. Для аудиодисков начальной является зона помеченная как TRACK 00, где хранится оглавление. Более точно определение для данного поля выглядело бы так: это число сэмплов от первого сэмпла на диске до первого сэмпла превой индексной точки первого трека. В соответствии со стандартом Red Book начальная зона должна содержать тишину, поэтому программы для копирования с аудиодиска обычно не сохраняют ее. Кроме того начальная зона должна занимать не меньше двух секунд. Поэтому здесь хранится длина начальной зоны, чтобы потом моджно было вычислить абсолютную позицию первого трека. Обратите внимание на то, что число сэмплов указывается до первой индексной точки первого трека, а не обязательно до точки INDEX 01 первого трека, так как на первом треке могут быть данные с индексом INDEX 00.
<1> 1, если CUESHEET соответствует компакт диску, иначе 0.
<7+258*8> Зарезервировано. Все биты должны быть равны 0.
<8> Количество треков. Для аудиодисков это число должно быть не больше, чем 100 (99 обычных треков и завершающий трек).
CUESHEET_TRACK+ Один или больше треков. В блоке CUESHEET обязательно должен быть завершающий трек@@@@. По спецификации Red Book на аудиодисках номер завершающего трека должен равняться 170.

CUESHEET_TRACK
<64> Смещение трека в сэмплах относительно начала аудиопотока FLAC. Это смещение для первой индексной точки трека. (Обратите внимание на отличие от аудиодиска, где смещение трека в содержании хранится в INDEX 01, даже если есть INDEX 00.) В аудиодиске смещение всегда кратно 588 (588 сэмплов = 44100 сэмплов/сек. * 1/75 сек.).
<8> Номер трека. Номер трека 0 недопустим, чтобы избежать конфликта со спецификацией аудиодиска, которая резервирует этот номер для начального трека. Для аудиодиска номер должен быть от 1 до 99 или 170 для завершающего трека. Не является необходимым, но рекомендуется начинать нумерацию с 1 и увеличивать номера последовательно. Номера треков в списке должны быть уникальными.
<12*8> Международный стандартный код записи (ISRC) для трека. Это 12-символьный код, состоящий только из цифр; см. здесь и здесь. Значение из 12 пустых символов ASCII можно использовать, чтобы указать на отсутствие ISRC.
<1> Тип трека: 0 - для аудио, 1 - для остальных типов данных. Это поле соответствует третьему контольному биту Q-канала аудиодиска.
<1> Флаг предварительной корелляции: 0 -- если ее нет, иначе 1. Соответствует 5 контрольному биту Q-канала аудиодиска; см. здесь.
<6+13*8> Зарезервировано. Все биты должны быть равны 0.
<8> Число индексных точек трека. Для каждого трека должен быть хотя бы один индекс, кроме завершающего, у которого нет индекса. У аудиодиска это число не должно быть больше 100.
ИНДЕКС_ТРЕКА_В_СПИСКЕ+ Одна или больше индексных точек для трека.

ИНДЕКС_ТРЕКА_В_СПИСКЕ
<64> Смещение в сэмплах индексной точки относительно смещения трека. Для аудиодиска смещение должно быть кратно 588 (588 сэмплов = 44100 сэмплов/сек. * 1/75 сек.). Обратите внимание на то, что смещение берется от начала трека, а не от начала аудиоданных.
<8> Номер индексной точки. Первый индекс трека должен иметь номер 0 или 1, а далее номера индексов должны последовательно увеличиваться на 1. Номера индексов для трека должны быть уникальны.
<3*8> Зарезервировано. Все биты должны быть равны 0.

1
ФРЕЙМ
ЗАГОЛОВОК_ФРЕЙМА  
ПОДФРЕЙМ+ Один подфрейм на канал
Выравнивание нулями на границу байта
ЗАВЕРШЕНИЕ_ФРЕЙМА  

ЗАГОЛОВОК_ФРЕЙМА
<14> код синхронизации 11111111111110
<2> Зарезервировано:
  • 00 : обязательное значение
  • 01-11 : зарезервировано для последующего использования
<4> Размер блока в сэмплах:
  • 0000 : получить из блока метаданных STREAMINFO
  • 0001 : 192 сэмпла
  • 0010-0101 : 576 * (2^(2-n)) сэмплов, т.е. 576/1152/2304/4608
  • 0110 : получить 8 битов (размер блока-1) из конца заголовка
  • 0111 : получить 16 битов (размер блока-1) из конца заголовка
  • 1000-1111 : 256 * (2^(n-8)) сэмплов, т.е. 256/512/1024/2048/4096/8192/16384/32768
<4> Частота дискретизации:
  • 0000 : получить из блока метаданных STREAMINFO
  • 0001-0011 : зарезервированы
  • 0100 : 8кГц
  • 0101 : 16кГц
  • 0110 : 22.05кГц
  • 0111 : 24кГц
  • 1000 : 32кГц
  • 1001 : 44.1кГц
  • 1010 : 48кГц
  • 1011 : 96кГц
  • 1100 : получить 8-битное значение частоты дискретизации (в кГц) из конца заголовка
  • 1101 : получить 16-битное значение частоты дискретизации (в Гц) из конца заголовка
  • 1110 : получить 16-битное значение частоты дискретизации (в дГц) из конца заголовка
  • 1111 : ошибочное значение, чтобы не допустить совпадение с кодом синхронизации
<4> Расположение каналов:
  • 0000-0111 : (количество независимых каналов)-1. Когда == 0001, канал 0 является левым, 1 - правым
  • 1000 : левостороннее стерео: канал 0 является левым, 1 - разностным
  • 1001 : правостороннее стерео: канал 0 является разностным, 1 - правым
  • 1010 : усредненное стерео: канал 0 является усредненным, 1 - разностным
  • 1011-1111 : зарезервированы
<3> Количество битов на сэмпл:
  • 000 : получить из блока метаданных STREAMINFO
  • 001 : 8 бит на сэмпл
  • 010 : 12 бит на сэмпл
  • 011 : зарезервировано
  • 100 : 16 бит на сэмпл
  • 101 : 20 бит на сэмпл
  • 110 : 24 бит на сэмпл
  • 111 : зарезервировано
<1> Дополнение нулем до границы бита, чтобы не допустить ошибку синхронизации
Если (переменный размер блока)
   <8-56> : номер сэмпла в формате UTF-8 (размер декодируемого числа 36 бит)
иначе
   <8-48> : номер фрейма в формате UTF-8 (размер декодируемого числа 31 бит)
Если (битовая маска размера блока == 11x)
   8/16 бит (размер блока - 1)
Если (битовая маска частоты дискретизации == 11xx)
   частота дискретизации 8/16 бит
<8> 8-битная полиномальная контрольная сумма (x^8 + x^2 + x^1 + x^0) данных заголовка, включая код синхронизации (x инициализируется нулем).
  Примечания:
  • Биты размера блока 0000-0101 могут быть использованы только при постоянном их значении во всем блоке. Биты 0110-0111 могут использоваться в любом случае, декодер будет считать, что поток имеет переменную длину блока. Существует одно исключение: кодер может использовать биты 0110-0111 в последнем фрейме потока с постоянным размером блока в том случае, если его длина не больше, чем используемая в всем потоке.

ЗАВЕРШЕНИЕ_ФРЕЙМА
<16> 16-битная полиномальная контрольная сумма (x^16 + x^15 + x^2 + x^0) всего фрейма (x инициализируется нулем).

ПОДФРЕЙМ
ЗАГОЛОВОК_ПОДФРЕЙМА  
ПОДФРЕЙМ_CONSTANT || ПОДФРЕЙМ_FIXED ||
ПОДФРЕЙМ_LPC || ПОДФРЕЙМ_VERBATIM
Тип подфрейма, определяемый в заголовке

ЗАГОЛОВОК_ПОДФРЕЙМА
<1> Бит равный 0, чтобы предотвратить ошибку синхронизации.
<6> Тип подфрейма:
  • 000000 : ПОДФРЕЙМ_CONSTANT
  • 000001 : ПОДФРЕЙМ_VERBATIM
  • 00001x : зарезервировано
  • 0001xx : зарезервировано
  • 001xxx : Если (xxx <= 4) ПОДФРЕЙМ_FIXED, xxx = порядок; иначе зарезервировано
  • 01xxxx : зарезервировано
  • 1xxxxx : ПОДФРЕЙМ_LPC, xxxxx = порядок-1
<1+k> Флаг 'неиспользуемые биты на сэмпл':
  • 0 : в исходном подблоке нет 'неиспользуемых битов', k=0
  • 1 : k 'неиспользуемых битов' в исходном подблоке, число записывается в унарном формате; т.е. для k=3 последовательность битов будет выглядеть так 001, для k=7 - 0000001.
  Примечания:
  • 'Неиспользуемые биты' встречаются в блоке данных, если при заявленных n битах значимыми являются только m. Число k = n - m и будет определять количество 'неиспользуемых битов'. Например, если все 16-битные сэмплы в исходном подблоке выглядят как 'xxxxxxxxxxxxx000', то кодер кодирует только 13 бит, и запоминает, что 3 бита являются 'неиспользуемыми'.

ПОДФРЕЙМ_CONSTANT
Несжатое постоянное значение подблока, n равно количеству битов на сэмпл во фрейме

ПОДФРЕЙМ_FIXED
Некодируемые начальные сэмплы (n равно количеству битов на сэмпл во фрейме, умноженному на порядок предиктора).
ОСТАТОК Закодированный остаток

ПОДФРЕЙМ_LPC
Некодируемые начальные сэмплы (n равно количеству битов на сэмпл во фрейме, умноженному на порядок предиктора).
<4> (точность дискретного коэффициета линейного прогнозирования (QLP)) - 1. Значение 1111 недопустимо.
<5> Необходимый сдвиг дискретного коэффициета линейного прогнозирования в битах. (Примечание: это число - знаковое дополнение до двух).
Несжатые коэффициенты прогнозирования (n = точность QLP * порядок LPC) (Примечание: эти числа являются знаковыми дополнениями до двух).
ОСТАТОК Закодированный остаток

ПОДФРЕЙМ_VERBATIM
Несжатый подблок, n равно количеству битов на сэмпл во фрейме, i - размеру блока

ОСТАТОК
<2> Метод кодирования остатков:
  • 00 : кодирование Райса
  • 01-11 : зарезервировано
ОСТАТКИ_СЖАТЫЕ_МЕТОДОМ_РАЙСА  
  Примечания:
  • Сейчас FLAC использует только один метод кодирования остатков

ОСТАТКИ_СЖАТЫЕ_МЕТОДОМ_РАЙСА
<4> Порядок раздела
РАЗДЕЛ_РАЙСА+ Далее следуют 2^порядок разделов

РАЗДЕЛ_РАЙСА
<4(+5)> Параметр кодирования:
  • 0000-1110 : Параметр Райса.
  • 1111 : Код, означающий, что раздел является несжатым и в нем используются n битов на сэмпл. n представлено 5-битным числом.
Закодированный остаток. Количество сэмплов n в разделе определяется следующим образом:
  • Если порядок раздела равен 0, n равно размеру блока для фрейма.
  • иначе если это не первый раздел подфрейма, n = (размер блока для фрейма / (2^порядок раздела))
  • иначе n = (размер блока для фрейма / (2^порядок раздела)) - порядок предиктора

 Copyright (c) 2000,2001,2002,2003 Josh Coalson