Formatul Flac

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:

  • Divizarea în blocuri. Intrarea este împărțită într-un număr de blocuri consecutive, care pot avea o dimensiune diferită. Dimensiunea optimă a blocului depinde, de obicei, de mai mulți factori, cum ar fi frecvența dischetei, răspunsul spectral în timp și așa mai departe. În ciuda faptului că formatul FLAC permite utilizarea blocurilor de dimensiuni diferite în flux, encoder-ul de bază utilizează o dimensiune constantă.
  • Decorarea între canale. În cazul fluxurilor stereo, codificatorul generează un semnal mediu și un diferențial bazat pe valoarea medie dintre canalele stânga și dreapta și, respectiv, diferențele lor. Cea mai bună codare a semnalului comprimat este transmisă la următoarea etapă de codificare.
  • Previzionarea. Apoi, encoder-ul încearcă să găsească o descriere matematică a semnalului (de obicei aproximativ). Adesea este mult mai puțin decât semnalul însuși. Deoarece metodele de predicție sunt cunoscute atât encodorului, cât și decodorului din flux, trebuie specificați doar parametrii predictori. Acum, FLAC utilizează patru clase diferite de predictori (descrise în secțiunea Prognoză), dar există loc pentru alte metode în format. FLAC permite o modificare a clasei predictorului de la bloc la bloc și chiar și în cadrul canalului din bloc.
  • Codificarea reziduurilor. Dacă predictorul nu descrie cu precizie semnalul, diferența dintre semnalul original și semnalul prezis (numit încă eronat sau rezidual) trebuie să fie codificat fără pierderi. Dacă predicția este eficientă, semnalul rezidual va lua mai puțin biți pe eșantion decât semnalul original. Acum, FLAC utilizează o singură metodă pentru codarea reziduurilor (vezi secțiunea Codificarea resturilor), dar există loc pentru alte metode în format. FLAC permite o modificare a metodei de codare a reziduurilor de la un bloc la un bloc și chiar și într-un canal dintr-un bloc.

    Î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.

  • Un bloc este unul sau mai multe eșantioane în mai multe canale.
  • Un subblock este unul sau mai multe eșantioane dintr-un canal. Astfel, blocul conține un subbloc pentru fiecare canal și toate sub-blocurile din el conțin același număr de eșantioane.
  • Dimensiunea blocului este numărul de eșantioane din oricare dintre sub-blocurile sale. De exemplu, un bloc de o secundă lungă, cu o frecvență de descretare de 44,1 kHz are o dimensiune bloc de 44100, indiferent de numărul de canale.
  • Un cadru este un antet și unul sau mai multe cadre secundare.
  • Subframe este un antet și una sau mai multe eșantioane codificate dintr-un canal dat. Toate cadrele secundare din acest cadru conțin același număr de eșantioane.

    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ă.

  • Independent. Canalele stânga și dreapta sunt codificate independent.
  • Diferență. Canalele stângi și drepte sunt convertite în canalele medii și reziduale. Canalul mediu este valoarea medie a semnalelor stânga și dreapta, iar canalul rezidual este diferența dintre acestea (stânga minus dreapta).
  • Mâna stângă. Canalele stânga și reziduală sunt codificate.
  • Pravoostoronnee. Canalele drepte și cele reziduale sunt codificate.

    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:

  • Literalul. În esență, aceasta este predicția unui semnal la nivel zero. Preamplificatorul de semnal este semnalul în sine, astfel încât nu se produce comprimarea. Acesta este un eșantion, cu care toți ceilalți predictori sunt comparați. Dacă trimiteți date aleatorii la codificator, cuvântul predicator va fi cel mai probabil utilizat pentru toate subblocurile. Deoarece semnalul brut nu trece prin etapa de codificare a reziduurilor, rezultatele nu vor coincide cu predictorul liniar de ordin zero.
  • Permanent. Acest predictor este utilizat atunci când subblock-ul conține tăcere digitală, adică intrarea este o constantă. Semnalul este codat pe întreaga lungime și adăugat în flux.
  • Predictor liniar constant. FLAC utilizează o clasă de predictori liniari constanți calculați efectiv (o descriere bună este dată în Shorten și AudioPak). FLAC adaugă un predictor de nivel 4 predictorilor utilizați în Shorten de la zero la al treilea nivel. Deoarece predictorii sunt constanți, trebuie să se păstreze doar ordinea predictorului în fluxul comprimat. Semnalul rezidual este transmis codificatorului rezidual.
  • Predicția liniară a FIR. Pentru o modelare mai precisă (datorită funcționării lente), FLAC suportă predicția FIR liniară la 32 de ordine (a se vedea Scurtarea și AudioPak). Codificatorul de bază utilizează metoda Levinson-Durbin pentru a calcula coeficienții LPC din coeficienții de autocorelare și coeficienții sunt împărțiți înainte de a calcula reziduurile. În timp ce astfel de encodere ca Shorten utilizează o partiție constantă pentru toate intrările, FLAC permite fiecărui cadru să schimbe precizia factorului de partiționare. Codificatorul FLAC de bază estimează precizia optimă pe baza dimensiunii blocului și a intervalului semnalului original.

    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:

    1. Codificatorul estimează un singur parametru Rice pe baza diferenței dintre restul și codurile Rice. Restul este codificat folosind acest parametru.
    2. 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ă
    Dimensiunea blocului în eșantioane:
    • 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
    Frecvența eșantionării:
    • 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
    Aranjament canal:
    • 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
    Numărul de biți per mostră:
    • 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.






    Articole similare

    Trimiteți-le prietenilor: