Тут наведено повний опис формату FLAC.
По-перше, як основний розробник, я повинен відзначити, що не є експертом в області стиснення, тому відчуваю себе зобов'язаним подякувати багатьох людей, які працювали над поліпшенням алгоритмів компресії звукової інформації. Окрему подяку я висловлюю:
Галузь застосування
Загальновідомо, що немає алгоритму, здатного стиснути без втрат вхідні дані будь-якого типу. Більшість архиваторов позиціонуються для роботи з даними певного виду і оптимізуються для цієї області. FLAC призначений для стиснення аудіо. Незважаючи на те, що він може стиснути без втрат дані будь-якого типу, тільки певний введення архівується добре. FLAC використовує той факт, що зазвичай звукові дані мають високий порядок кореляції між семплами.
В області аудіо існує безліч можливих підрозділів. Наприклад, мова з низьким бітрейтом, багатоканальна музика з високою частотою дискретизації і т.д. FLAC не націлений на будь-якої підрозділ, проте більшість параметрів за замовчуванням базового кодера розраховані на CD-аудіо (тобто 44.1кГц, 2 канали, 16 біт на семпл). Вплив параметрів кодування на різні типи аудіо буде розглянуто пізніше.
архітектура
Як і більшість програм такого роду, кодер FLAC виконує наступні дії:
На додаток до всього визначена система метаданих, що дозволяє додавати до початку потоку довільну інформацію.
визначення
Багато терміни, такі як "блок" і "фрейм", мають різне значення в схемах кодування. Наприклад, фрейм в mp3 сооветствует багатьом семплам у всіх каналах, в той час як фрейм S / PDIF представляє тільки один семпл для кожного каналу. Зверніть увагу на те, що, кажучи про "блоках" і "подблоков", ми посилаємося на незакодований звукові дані, а терміни "фрейм" і "підфреймів" використовуємо для даних стислих FLAC.
Розбиття на блоки
Розмір блоків сильно впливає на рівень стиснення. Якщо розмір блоку буде занадто малий, то в підсумку вийде дуже багато фреймів, а це значить, що на заголовки буде витрачено багато бітів. Якщо ж розмір блоку великий, а характеристики сигналу сильно варіюються, кодер не зможе знайти хороший предиктор. Щоб спростити кодек, FLAC визначає мінімальний розмір блоку в 16 семплів, а максимальний в 65535 семплів. Цей інтервал покриває оптимальні розміри блоків для всіх аудіо, підтримуваних FLAC.
Зараз базовий кодер використовує постійний розмір блоку, оптимізований за частотою дискретизації введення. Подальші версії зможуть змінювати розмір блоку в залежності від характеристик сигналу.
Розбиті на блоки дані передаються на стадію прогнозування по одному подблоков. Кожен подблок кодується в підфреймів незалежно, а пізніше вони об'ендіняются у фрейм. Так як кожен канал кодується окремо, це означає, що один канал стерео фрейма може стискуватися як постійний підфреймів, а другий як LPC підфреймів.
міжканального декорреляции
У більшості випадків в стерео потоках існує достатній рівень кореляції між лівим і правим каналами. FLAC дозволяє фреймам в стерео потоках мати різний розподіл каналів, а кодер може використовувати краще представлення.
Виявляється, що лівосторонній і правосторонній кодування можуть бути більш ефективними у багатьох фреймах, незважаючи на те, що необхідне для оригінального сигналу кількість бітів на семпл трохи більше, ніж для незалежного або усередненого кодування.
прогнозування
FLAC використовує чотири методи для моделювання вхідного сигналу:
кодування залишків
Для кодування залишкового сигналу від стадії прогнозування FLAC використовує два схожих методу. Остаточний сигнал стискається з використанням кодів Райса наступними способами:
- Кодер оцінює одиночний параметр Райса, заснований на різниці залишку та кодів Райса. Весь залишок кодується з використанням цього параметра.
- Залишок ділиться на кілька інтервалів однакової довжини і кожен з них кодується зі своїм параметром Райса, заснованим на середньому значенні для даного інтервалу.
Зверніть увагу на те, що перший метод є окремим випадком другого з одним інтервалом. Відмінність полягає в тому, що в першому методі параметр Райса обчислюється для різниці залишку, а не для середнього значення.
У форматі FLAC зарезервовано місце для інших методів кодування. Хто-небудь може спробувати знайти найкраще контекстне моделювання параметра Райса або кодування Хаффмана. Описи декількох універсальних кодів можна знайти на сторінках LOCO-I і pucrunch.
У цьому розділі описується формат файлу. Формат FLAC не передбачає поля для номера версії, однак містить кілька зарезервованих позицій. Подальші версії зможуть використовувати це місце без порушення сумісності з попередніми версіями. Більш старі версії декодерів можуть або припиняти роботу, або пропускати дані, закодовані новими методами. Крім того зарезервовані деякі спеціальні значення, які не можуть з'явитися в жодній з версій формату. Це зазвичай робиться для поліпшення механізму синхронізації.
Всі числа в форматі FLAC є цілими, молодший байт яких записується спочатку (big-endian). Числа є беззнаковими, крім тих випадків, де явно вказано інше.
До потоку FLAC можуть бути додані теги ID3v1 (в кінці) і ID3v2 (на початку). Ці дані не відносяться до формату, проте декодер вміє пропускати їх.
Перед повним описом формату наведемо його короткий огляд.
У таблиці наведено формальний опис формату FLAC. Числа в кутових дужках показують кількість бітів, використовуваних даним полем.
"FLaC", маркер потоку FLAC в кодуванні ASCII, що означає, що першими чотирма байтами потоку є 0x66, 0x4C, 0x61, 0x43
зарезервовано:- 00. обов'язкове значення
- 01-11. зарезервовано для подальшого використання
- 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
- 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. помилкове значення, щоб не допустити збіг з кодом синхронізації
- 0000-0111. (Кількість незалежних каналів) -1. Коли == 0001. канал 0 є лівим, 1 - правим
- 1000. лівосторонній стерео: канал 0 є лівим, 1 - різницевим
- 1001. правосторонній стерео: канал 0 є різницевим, 1 - правим
- 1010. усереднене стерео: канал 0 є усередненими, 1 - різницевим
- 1011-1111. зарезервовані
- 000. отримати з блоку метаданих STREAMINFO
- 001. 8 біт на семпл
- 010. 12 біт на семпл
- 011. зарезервовано
- 100. 16 біт на семпл
- 101. 20 біт на семпл
- 110. 24 біт на семпл
- 111. зарезервовано
Доповнення нулем до кордону біта, щоб не припуститися помилки синхронізації
Якщо (змінний розмір блоку)
. номер семпли в форматі UTF-8 (розмір декодіруемой числа 36 біт)
інакше
. номер фрейма в форматі UTF-8 (розмір декодіруемой числа 31 біт)
Якщо (бітова маска розміру блоку == 11x)
8/16 біт (розмір блоку - 1)
Якщо (бітова маска частоти дискретизації == 11xx)
частота дискретизації 8/16 біт
8-бітна поліномальная контрольна сума (x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0) даних заголовка, включаючи код синхронізації (x инициализируется нулем).
Примітки.- Біти розміру блоку 0000-0101 можуть бути використані тільки при постійному їх значенні у всьому блоці. Біти 0110-0111 можуть використовуватися в будь-якому випадку, декодер буде вважати, що потік має змінну довжину блоку. Існує один виняток: кодер може використовувати біти 0110-0111 в останньому фреймі потоку з постійним розміром блоку в тому випадку, якщо його довжина не більше, ніж використовувана в усьому потоці.