Flac формат

Тут наведено повний опис формату FLAC.

По-перше, як основний розробник, я повинен відзначити, що не є експертом в області стиснення, тому відчуваю себе зобов'язаним подякувати багатьох людей, які працювали над поліпшенням алгоритмів компресії звукової інформації. Окрему подяку я висловлюю:

Галузь застосування

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

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

архітектура

Як і більшість програм такого роду, кодер FLAC виконує наступні дії:

  • Розбиття на блоки. Введення розбивається на безліч послідовних блоків, які можуть мати різний розмір. Оптимальний розмір блоку зазвичай залежить від багатьох факторів, таких як частота діскетізаціі, спектральна характеристика в часі і т.д. Незважаючи на те, що формат FLAC дозволяє використовувати в потоці блоки різного розміру, базовий кодер використовує постійний розмір.
  • Міжканального декорреляции. У разі стереопотоков кодер створює середній і різницевий сигнали, засновані на середньому значенні між лівим і правим каналами і їх різниці відповідно. На наступний етап кодування передається кращий з варіантів стисненого сигналу.
  • Прогнозування. Далі кодер намагається знайти математичний опис сигналу (зазвичай приблизне). Найчастіше воно значно менше самого сигналу. Так як методи передбачення відомі і кодеру, і декодера в потоці потрібно вказати тільки параметри предиктор. Зараз FLAC використовує чотири різних класи предикторов (описаних в розділі Прогнозування), але в форматі передбачено місце для додаткових методів. FLAC допускає зміну класу предіктора від блоку до блоку і навіть в межах каналу в блоці.
  • Кодування залишків. Якщо предиктор не описує сигнал точно, різниця між оригінальним сигналом і спрогнозованим (званим ще помилковим або залишковим) повинна бути закодована без втрат. Якщо передбачення ефективно, залишковий сигнал буде займати менше біт на семпл, ніж оригінальний сигнал. Зараз FLAC використовує тільки один метод для кодування залишків (див. Розділ Кодування залишків), проте в форматі передбачено місце для додаткових методів. FLAC допускає зміну методу кодування залишків від блоку до блоку і навіть в межах каналу в блоці.

    На додаток до всього визначена система метаданих, що дозволяє додавати до початку потоку довільну інформацію.

    визначення

    Багато терміни, такі як "блок" і "фрейм", мають різне значення в схемах кодування. Наприклад, фрейм в mp3 сооветствует багатьом семплам у всіх каналах, в той час як фрейм S / PDIF представляє тільки один семпл для кожного каналу. Зверніть увагу на те, що, кажучи про "блоках" і "подблоков", ми посилаємося на незакодований звукові дані, а терміни "фрейм" і "підфреймів" використовуємо для даних стислих FLAC.

  • Блок - це один або більше семплів, що знаходяться в декількох каналах.
  • Підблок - це один або більше семплів з одного каналу. Таким чином, блок містить подблок для кожного каналу і все подблоки в ньому містять однакову кількість семплів.
  • Розмір блоку - це кількість семплів в будь-якому зі своїх подблоков. Наприклад, блок довжиною в одну секунду з частотою дескретізаціі 44.1кГц має розмір блоку 44100 незалежно від кількості каналів.
  • Фрейм - це заголовок і один або кілька подфреймов.
  • Підфреймів - це заголовок і один або кілька закодованих семплів з даного каналу. Все підфреймів в даному фреймі містять однакову кількість семплів.

    Розбиття на блоки

    Розмір блоків сильно впливає на рівень стиснення. Якщо розмір блоку буде занадто малий, то в підсумку вийде дуже багато фреймів, а це значить, що на заголовки буде витрачено багато бітів. Якщо ж розмір блоку великий, а характеристики сигналу сильно варіюються, кодер не зможе знайти хороший предиктор. Щоб спростити кодек, FLAC визначає мінімальний розмір блоку в 16 семплів, а максимальний в 65535 семплів. Цей інтервал покриває оптимальні розміри блоків для всіх аудіо, підтримуваних FLAC.

    Зараз базовий кодер використовує постійний розмір блоку, оптимізований за частотою дискретизації введення. Подальші версії зможуть змінювати розмір блоку в залежності від характеристик сигналу.

    Розбиті на блоки дані передаються на стадію прогнозування по одному подблоков. Кожен подблок кодується в підфреймів незалежно, а пізніше вони об'ендіняются у фрейм. Так як кожен канал кодується окремо, це означає, що один канал стерео фрейма може стискуватися як постійний підфреймів, а другий як LPC підфреймів.

    міжканального декорреляции

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

  • Незалежне. Лівий і правий канали кодуються незалежно.
  • Різницеве. Лівий і правий канал перетворюються в середній і залишковий канали. Середній канал - це середнє значення лівого і правого сигналів, а залишковий - різниця між ними (лівий мінус правий).
  • Лівосторонній. Кодується лівий і залишковий канали.
  • Правоостороннее. Кодується правий і залишковий канали.

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

    прогнозування

    FLAC використовує чотири методи для моделювання вхідного сигналу:

  • Дослівний. По суті це прогнозування сигналу нульового рівня. Предиктором сигналу є сам сигнал, тому стиснення не відбувається. Це зразок, з яким звіряються всі інші предиктори. Якщо передати кодеру випадкові дані, для всіх подблоков скоріш за все буде використаний дослівний предиктор. Так як необроблений сигнал не проходить стадію кодування залишків, результати не будуть збігатися з лінійним предиктором нульового порядку.
  • Постійний. Цей предиктор використовується, коли подблок містить цифрову тишу, тобто на вхід надходить одна константа. Сигнал кодується по всій довжині і додається до потоку.
  • Постійний лінійний предиктор. FLAC використовує клас ефективно обчислюваних постійних лінійних предикторов (хороший опис наведено у Shorten і AudioPak). FLAC додає предиктор четвертого рівня до використаним в Shorten предикторам від нульового до третього рівня. Так як предиктори постійні, в стислому потоці необхідно зберегти тільки порядок предиктор. Остаточний сигнал передається кодеру залишків.
  • Лінійне прогнозування FIR. Для більш точного моделювання (за рахунок повільної роботи) FLAC підтримує лінійне прогнозування FIR до 32 порядку (див. Shorten і AudioPak). Базовий кодер використовує метод Левінсона-Дарбина для розрахунку LPC коефіцієнтів з коефіцієнтів автокореляції і коефіцієнти розбиваються перед обчисленням залишків. У той час як такі кодери як Shorten використовують постійне розбиття для всього введення, FLAC дозволяє для кожного фрейма змінювати точність коефіцієнта розбиття. Базовий кодер FLAC оцінює оптимальну точність, грунтуючись на розмірі блоку і діапазоні оригінального сигналу.

    кодування залишків

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

    1. Кодер оцінює одиночний параметр Райса, заснований на різниці залишку та кодів Райса. Весь залишок кодується з використанням цього параметра.
    2. Залишок ділиться на кілька інтервалів однакової довжини і кожен з них кодується зі своїм параметром Райса, заснованим на середньому значенні для даного інтервалу.

    Зверніть увагу на те, що перший метод є окремим випадком другого з одним інтервалом. Відмінність полягає в тому, що в першому методі параметр Райса обчислюється для різниці залишку, а не для середнього значення.

    У форматі 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 в останньому фреймі потоку з постійним розміром блоку в тому випадку, якщо його довжина не більше, ніж використовувана в усьому потоці.

    Схожі статті