Iată o descriere completă a formatului FLAC.
În primul rând, în calitate de dezvoltator principal, trebuie să remarcăm că nu sunt un expert în comprimare, așa că mă simt obligat să mulțumesc multor oameni care au lucrat la îmbunătățirea algoritmilor de comprimare a datelor audio. Îmi exprim recunoștința deosebită:
Domeniul de aplicare
În general, se știe că nu există nici un algoritm capabil de a comprima fără pierderi date de intrare de orice tip. Cele mai multe arhive sunt poziționate pentru a lucra cu date de un anumit tip și sunt optimizate pentru această zonă. FLAC este proiectat pentru a comprima date audio. În ciuda faptului că poate comprima date fără pierderi de orice tip, doar o anumită intrare este arhivată bine. FLAC utilizează faptul că, în mod normal, datele audio au o ordine mare de corelare între eșantioane.
În domeniul audio, există multe subsecțiuni posibile. De exemplu, vorbire cu rate reduse de biți, muzică multi-canal cu o rată de eșantionare ridicată etc. FLAC nu vizează nicio subsecțiune, dar majoritatea parametrilor impliciți ai encoderului de bază sunt proiectați pentru CD audio (de ex. 44,1 kHz, 2 canale, 16 biți pe eșantion). Efectul codării parametrilor asupra diferitelor tipuri de audio va fi discutat mai târziu.
arhitectură
Ca majoritatea programelor de acest tip, codificatorul FLAC face următoarele:
În plus, este definit un sistem de metadate care vă permite să adăugați informații arbitrare la începutul fluxului.
defini
Mulți termeni, cum ar fi "bloc" și "cadru", au semnificații diferite în schemele de codificare. De exemplu, un cadru în format mp3 se potrivește cu multe eșantioane în toate canalele, în timp ce cadrul S / PDIF reprezintă doar un eșantion pentru fiecare canal. Rețineți că atunci când se face referire la "blocuri" și "subblocuri", ne referim la date audio necodificate, iar termenii "cadru" și "subframe" sunt utilizați pentru datele FLAC comprimate.
blocuri de partiționare
Dimensiunea blocurilor afectează în mare măsură nivelul de compresie. Dacă dimensiunea blocului este prea mică, atunci în final se va dovedi a fi o mulțime de cadre, ceea ce înseamnă că mai mulți biți vor fi cheltuiți pe anteturi. Dacă dimensiunea blocului este mare și caracteristicile semnalului variază foarte mult, codificatorul nu va putea găsi un predictor bun. Pentru a simplifica codecul, FLAC definește o dimensiune minimă a blocurilor de 16 eșantioane și un maxim de 65535 de eșantioane. Acest interval acoperă dimensiunile optime ale blocurilor pentru toate datele audio suportate de FLAC.
Acum, codificatorul de bază utilizează o dimensiune constantă a blocului, optimizată pentru frecvența de eșantionare a intrării. Versiunile ulterioare vor putea modifica dimensiunea blocului în funcție de caracteristicile semnalului.
Datele blocate sunt transferate în stadiul de predicție pentru un sub-bloc. Fiecare subbloc este codificat independent în subramură, iar ulterior sunt combinate într-un cadru. Deoarece fiecare canal este codificat separat, acest lucru înseamnă că un canal al cadrului stereo poate fi comprimat ca un sub-cadru constant, iar al doilea ca un sub-cadru LPC.
Decorarea între canale
În majoritatea cazurilor, există un nivel suficient de corelație între canalele stânga și dreapta în fluxurile stereo. FLAC permite cadrelor în fluxuri stereo să aibă diferite alocări de canale, iar un codificator poate utiliza o vizualizare mai bună.
Se pare că codificarea stânga și cea dreaptă poate fi mai eficientă în mai multe cadre, în ciuda faptului că numărul de biți per probă necesar pentru semnalul original este puțin mai mare decât pentru codarea independentă sau medie.
prezicere
FLAC utilizează patru metode pentru a simula semnalul de intrare:
Codificarea resturilor
Pentru a codifica semnalul rezidual din etapa de predicție, FLAC utilizează două metode similare. Semnalul rezidual este comprimat folosind codurile Rice în următoarele moduri:
- Codificatorul estimează un singur parametru Rice pe baza diferenței dintre restul și codurile Rice. Restul este codificat folosind acest parametru.
- Restul este împărțit în mai multe intervale de aceeași lungime și fiecare dintre ele este codificat cu propriul parametru Rice, pe baza valorii medii pentru un anumit interval.
Rețineți că prima metodă este un caz special al celui de-al doilea cu un interval. Diferența este că, în prima metodă, parametrul Rice este calculat pentru diferența reziduală și nu pentru valoarea medie.
În formatul FLAC, spațiul pentru alte metode de codare este rezervat. Cineva ar putea încerca să găsească o mai bună modelare contextuală a parametrului Rice sau a codării Huffman. Descrierea mai multor coduri universale poate fi găsită pe paginile LOCO-I și pucrunch.
Această secțiune descrie formatul de fișier. Formatul FLAC nu oferă un câmp pentru numărul versiunii, dar conține mai multe elemente rezervate. Versiunile ulterioare vor putea utiliza acest site fără a compromite compatibilitatea cu versiunile anterioare. Versiunile vechi ale decodoarelor pot întrerupe sau pot sări date codificate prin metode noi. În plus, sunt rezervate anumite valori speciale, care nu pot apărea în nicio versiune a formatului. Aceasta se face de obicei pentru a îmbunătăți mecanismul de sincronizare.
Toate numerele în formatul FLAC sunt numere întregi, cel mai puțin octet semnificativ din care este scris la început (big-endian). Numerele sunt nesemnate, cu excepția cazurilor în care inversul este indicat explicit.
Etichetele FLIP pot fi adăugate ID3v1 (la sfârșit) și ID3v2 (la început). Aceste date nu se referă la format, dar decodorul le poate sări peste ele.
Înainte de o descriere completă a formatului, vom da o scurtă prezentare generală.
Tabelul oferă o descriere formală a formatului FLAC. Numerele din parantezele unghiulare indică numărul de biți utilizați de acest câmp.
"fLaC", FLAC marker de flux în codare ASCII, ceea ce înseamnă că primii patru octeți ai fluxului sunt 0x66, 0x4C, 0x61, 0x43
rezervat:- 00. valoare obligatorie
- 01-11. rezervat pentru utilizare ulterioară
- 0000. obțineți de la unitatea de metadate STREAMINFO
- 0001. 192 de eșantioane
- 0010-0101. 576 * (2 ^ (2-n)), adică 576/1152/2304/4608
- 0110. obține 8 biți (bloc-1) de la sfârșitul antetului
- 0111. obțineți 16 biți (dimensiunea blocului-1) de la sfârșitul antetului
- 1000-1111. 256 * (2 ^ (n-8)), adică 256/512/1024/2048/4096/8192/16384/32768
- 0000. obțineți de la unitatea de metadate STREAMINFO
- 0001-0011. rezervat
- 0100. 8kHz
- 0101, 16 kHz
- 0110, 22,05 kHz
- 0111, 24 kHz
- 1000, 32 kHz
- 1001, 44,1 kHz
- 1010, 48 kHz
- 1011, 96 kHz
- 1100. obțineți o rată de eșantionare pe 8 biți (în kHz) de la sfârșitul antetului
- 1101. obțineți o rată de eșantionare de 16 biți (în Hz) de la capătul antetului
- Obțineți o rată de eșantionare de 16 biți (în dhz) de la capătul antetului
- Valoarea 1111. eroare, pentru a preveni coincidența cu codul de sincronizare
- 0000-0,111. (numărul de canale independente) -1. Atunci când == 0001. Canalul 0 este lăsat, 1 are dreptate
- 1000. Stereo pe partea stângă: canalul 0 este lăsat, 1 - diferența
- 1001. dreapta stereo: canalul 0 este un canal diferențial, 1 este corect
- 1010. media stereo: canalul 0 este mediatizat, 1 - diferență
- 1011-1111. rezervat
- 000. Obțineți din unitatea de metadate STREAMINFO
- 001. 8 biți pe probă
- 010. 12 biți pe probă
- 011. Rezervat
- 100. 16 biți pe probă
- 101. 20 biți pe probă
- 110. 24 biți pe probă
- 111. Rezervat
Adăugați zero la limita de biți pentru a preveni o eroare de sincronizare
Dacă (dimensiunea blocului variabil)
. numărul eșantionului în format UTF-8 (dimensiunea numărului decodificat este de 36 de biți)
altfel
. numărul de cadru în format UTF-8 (dimensiunea numărului decodat este de 31 de biți)
Dacă (dimensiunea bitmask a blocului == 11x)
8/16 bit (dimensiunea blocului este 1)
Dacă (rata de eșantionare bitmask == 11xx)
rata de eșantionare 8/16 biți
Suma de control polinomial pe 8 biți (x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0) din datele antetului, inclusiv codul de sincronizare (x este inițializat la zero).
Note.- Bitii de mărimea blocului 0000-0101 pot fi utilizați numai dacă sunt constanți în întreg blocul. Bits 0110-0111 poate fi folosit în orice caz, decodorul va presupune că fluxul are o lungime variabilă a blocului. Există o singură excepție: codificatorul poate utiliza biții în ultimul cadru flux 0110-0111, cu o dimensiune a blocului constantă în cazul în care lungimea sa este mai mare decât cea utilizată în întreg fluxul.