Формат стиснення flac, linuxoid

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

Отже, FLAC стискає файли без втрат. При кодуванні даних не відбувається втрата інформації, тому і декодіруемий аудіофайл абсолютно ідентичний вихідному. Формат розроблений для стиснення звукових даних (використовується то що звукові дані мають високий порядок кореляції між семплами.), Але так як алгоритм роботи нагадує zip і розробники спочатку не вклали обмежень на вид вихідних даних, то теоретично можна стискати і будь-які інші дані, але розмір правда може не сильно відрізнятися від оригінального. Формат спочатку замислювався як розширюваний тому можливо додавання нових можливостей без втрати сумісності. FLAC є потоковим форматом, що досягається розбивкою даних на безліч блоків, які можуть мати різний розмір, хоча наявні кодеки використовують блоки тільки постійного розміру. Так як кожен блок кодується окремо, то змінюючи розмір блоку при кодуванні можна домогтися різної довжини вихідного файлу тому чим менше розмір блоку тим їх відповідно більше і збільшується кількість службової інформації. Розмір блоку визначається від 16 до 65535 семплів, що покриває оптимальні розміри для всіх можливих звукових даних (музика, мова). При цьому кожен блок повністю не залежимо від попереднього. Щоб визначити можливі помилки при передачі файлу, для кожного фрейма (закодованого блоку) обчислюється 16-бітна контрольна сума. Цілісність на подальшому етапі підтверджується підписом MD5 незжатих даних, яка знаходиться в заголовку і може бути перевірена при відтворенні, декодування або за допомогою тестування. До того ж кодер має режим роботи, при якому кодуються дані на льоту декодируются і порівнюються з оригіналом при наявності помилок робота припиняється. Розбиті на блоки дані передаються на стадію прогнозування по одному подблоков. Кожен подблок кодується в підфреймів незалежно, а пізніше вони об'єднуються у фрейм. Так як кожен канал кодується окремо, це означає, що один канал стерео фрейма може стискуватися як постійний підфреймів, а другий як LPC підфреймів. У кожного фрейма є заголовок, що складається з коду синхронізації, інформації про фрейм (розмір блоку, частота дискретизації, кількість каналів і т.п.) і восьмібітной контрольної суми. Також в заголовку міститься або номер першого семпли у фреймі щодо всього потоку (для потоків із змінним розміром блоку) або номер фрейма (для потоків з постійним розміром блоку). Це дозволяє проводити швидкий і точний пошук. Далі йдуть закодовані підфреймів (по одному на кожен канал) і, нарешті, фрейм, доповнений нулями до кордону байта. Кожен підфреймів має свій заголовок, який визначає спосіб його декодування. Так як лівий і правий канали в більшості випадків містити частину однакової інформації, то використовується метод міжканального декорреляции, яка може бути чотирьох різних видів, а кодер підбирає його індивідуально для кожного фрейму:

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

Для прогнозування використовуються чотири різних методи моделювання вхідного сигналу (дослівний, постійний, постійний лінійний предиктор LPC і лінійне прогнозування FIR). Чим вони відрізняються, дивіться на сайті. І, нарешті для кодування залишкового (помилкового) сигналу дістався від стадії прогнозування (який також необхідно врахувати для того щоб уникнути втрат) використовуються два схожих методу з використанням кодів Райса. Причому ці методи не є догмою можна при бажанні використовувати і свої методи кодування. Більш того, FLAC допускає зміну методу кодування залишків від блоку до блоку і навіть в межах каналу в блоці. Однією з цілей проекту є низькі апаратні вимоги, щоб забезпечити декодування в реальному часі навіть на старих комп'ютерах. Крім цього є два пункти які розробники не будуть і не хочуть реалізовувати (хоча якщо хтось і збирається, то будь ласка, але сумісність з оригіналом в цьому випадку не гарантується). Це стиснення з втратами і реалізація захисту від копіювання в будь-якому вигляді.

Отже, з особливостями трохи розібралися, тепер давайте перейдемо до практики. Всі приклади наводжу для платформи Linux, але для зацікавлених користувачів інших операційних систем всі необхідні посилання знайдете на сайті. Поставка FLAC включає:

• libFLAC. бібліотеку для базових кодеров і декодерів і інтерфейсу метаданих;

• libFLAC ++. об'єктну оболонку для libFLAC;

• libOggFLAC і libOggFLAC ++. обгортки кодеров і декодерів libFLAC і libFLAC ++. відповідно, для доступу до водних потоків FLAC в контейнері Ogg;

• flac. утиліту командного рядка, що виконує стиснення і розпаковування файлів .flac;

• metaflac. утиліту командного рядка для редагування метаданих в файлах .flac;

Плюс до всього в комплект входять плагіни для різних програвачів і бібліотеки для роботи з кодуваннями і ID тегами.

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

У найпростішому випадку, для того щоб закодувати wav файл в flac досить ввести команду без параметрів із зазначенням тільки вхідного файлу.
[Sergej @ grinder sound] $ flac test.wav

В результаті в поточному каталозі утворюється файл з таким же ім'ям, але розширенням .flac. Зверніть увагу на рядок options яка показує на дійсно використовуються опції кодування. Отримати коротку довідку можна ввівши просто flac, більш детальну з додатковою опцією -help. За замовчуванням використовується рівень стиснення 5, який можна змінити додавши - # (де # цифри від 0 (швидше) до 8 (краще)).

[Sergej @ grinder sound] $ flac -8 test.wav

Ім'я вихідного файлу можна задати явно скориставшись ключем -о. Для декодування файлу flac використовується ключ -d.

[Sergej @ grinder sound] $ flac -d test.flac

Утиліта metaflac дозволяє оперувати метаданими файлу, перевірити контрольну суму, розмір блоку і фрейму (максимальний і мінімальний), працювати з тегами в форматі Ogg Vorbis.

[Sergej @ grinder flac] $ metaflac -show-md5sum -show-min-framesize -show-sample-rate -show-total-samples test.flac

01762464f61bdf7ef35f268cf6f6e80a # MD5 сума

12723732 # загальна кількість семплів

А ось так можна скопіювати тег з файлу ogg і вставити його в flac.

[Sergej @ grinder flac] $ vorbiscomment -l -raw file.ogg | metaflac -import-vc-from = - -no-utf8-convert file.flac

Формат Одержаний розмір вихідного файлу, Мб Швидкість кодування.

Mp3 (LAME 128 кб \ с) 4.4 2 хв

Ogg пор. 112 кб \ с 3.9 4.08мін

FLAC 28.6 0.48 хв

Додатково я спробував, як міг порівняти якість отриманого аудіофайлу. Звичайно, я визнаю, що таке тестування несе елемент суб'єктивності і за всіма правилами має виробляється якомога більшою кількістю учасників і в «сліпу», інакше тестує вже заздалегідь «знає» про недоліки. Так що це все моя особиста думка, та й не домагався, якщо чесно кристально чистого експерименту. Цілі адже зовсім інші. Так ось який би не був хороший кодек Lame, mp3 відпочиває навіть у порівнянні з Ogg Vorbis, таке відчуття, що недодали мощі і глибини, навіть підсумковий розмір вийшов трохи більше ogg, але виграв в швидкості кодування у останнього майже вдвічі. До слова у мене ящик з трьохсотим целерон на борту і під Windows з її графічними утилітами на кодування цього ж файлу йде часу приблизно на 50 відсотків більше. Ogg Vorbis сподобався хорошим навіть сказав би відмінним звучанням і навіть при такому низькому бітрейті практично не чути відмінностей у всякому разі ріжучих слух. А ось FLAC як і wav відрізнити від оригіналу неможливо, але перший як бачите займає обсяг рівно в два рази менший (знову ж по-замовчуванню, пам'ятайте). Так що для тих, кому необхідно оригінальне звучання і при цьому є бажання заощадити місце на диску FLAC і буде якраз тим, що доктор прописав. Тепер чому ж все-таки його слухати. Як я говорив, доступні плагіни для багатьох програвачів. a.

От і все. Viva OpenSource!