Miten tiedostojen pakkaaminen toimii?
Ohjelmistotekniikan suunnittelijat ovat aina kehittäneet uusia tapoja sovittaa paljon tietoa pieneen tilaan. Oli totta, kun kiintolevyt olivat pieniä, ja Internetin kynnyksestä on juuri tullut kriittisempi. Tiedostojen pakkaaminen on tärkeä osa meitä yhdistämisessä, joten voimme lähettää vähemmän tietoja riviltä, jotta voimme ladata nopeammin ja sovittaa lisää yhteyksiä kiireisiin verkkoihin.
Joten miten se toimii?
Tähän kysymykseen vastattaessa selitetään joitakin hyvin monimutkaisia matematiikoita, varmasti enemmän kuin voimme kattaa tässä artikkelissa, mutta sinun ei tarvitse ymmärtää tarkasti, miten se toimii matemaattisesti ymmärtääkseen perusasiat.
Suosituimmat kirjastot tekstin pakkaamiseen perustuvat kahteen pakkausalgoritmiin, joissa molempia käytetään samanaikaisesti erittäin korkean puristussuhteen saavuttamiseksi. Nämä kaksi algoritmia ovat "LZ77" ja "Huffman-koodaus." Huffman-koodaus on melko monimutkainen, emmekä tule tässä yksityiskohtaisesti. Ensisijaisesti se käyttää jonkin verran fancy matematiikkaa määrittää lyhyemmän binaarikoodit yksittäisiin kirjaimiin, kutistuvat tiedostokoot prosessissa. Jos haluat lisätietoja siitä, tutustu tähän artikkeliin siitä, miten koodi toimii, tai Computerphilin selittäjä.
LZ77 on toisaalta suhteellisen yksinkertainen ja siitä puhumme. Se pyrkii poistamaan päällekkäisiä sanoja ja korvaamaan ne pienemmällä "avaimella", joka edustaa sanaa.
Ota tämä lyhyt teksti esimerkiksi:
LZ77-algoritmi tarkastelisi tätä tekstiä, ymmärtäen, että se toistaa "howtogeek" kolme kertaa ja muuttaa sen tähän:
Sitten, kun se haluaa lukea tekstin takaisin, se korvaisi jokaisen (h): n instanssin sanalla "howtogeek", mikä palauttaa meidät alkuperäiseen lauseeseen.
Me kutsumme tämän "häviöttömän" pakkauksen - tiedot, jotka olet asettanut, ovat samat kuin tiedot, jotka saat ulos. Mitään ei menetetä.
Todellisuudessa LZ77 ei käytä luettelonäppäimiä, vaan korvaa toisen ja kolmannen tapahtuman linkin takaisin muistiin:
Joten nyt, kun se tulee (h), se palaa takaisin "howtogeekiin" ja lukee sen.
Jos olet kiinnostunut tarkemmasta selityksestä, tämä Computerphile-video on melko hyödyllinen.
Nyt tämä on ideaalisoitu esimerkki. Todellisuudessa suurin osa tekstistä on pakattu niin vähän kuin vain muutama merkki. Esimerkiksi sana "the" tiivistettäisiin, vaikka se näkyy sanoissa "siellä", "heidän" ja "sitten". Toistuvalla tekstillä saat joitakin hulluja pakkaussuhteita. Ota tämä tekstitiedosto, jossa sana "howtogeek" toistetaan 100 kertaa. Alkuperäinen tekstitiedosto on kolme kilotavua. Pakattuina se vie kuitenkin vain 158 tavua. Se on lähes 95%: n pakkaus.
Nyt on selvää, että se on melko äärimmäinen esimerkki, koska meillä oli vain sama sana toistuvasti. Yleensä käytännössä saat todennäköisesti noin 30-40% pakkausta käyttämällä ZIP-muodossa olevaa pakkausmuotoa tiedostossa, joka on pääosin teksti.
Tätä LZ77-algoritmia sovelletaan kaikkiin binääritietoihin, ei pelkästään tekstiin, vaikka tekstiä on yleensä helpompi pakata, koska monta toistettua sanaa useimmissa kielissä käytetään. Kiina, kuten kiina, voi olla hieman vaikeampi pakata kuin esimerkiksi englanti.
Miten kuva ja video puristus toimii?
Videon ja äänen pakkaus toimii hyvin eri tavalla. Toisin kuin tekstissä, jossa voi olla häviötön pakkaus, ja tietoja ei menetetä, kuvilla on mitä “Lossy Compression” -toimintoa kutsutaan, jossa menetät joitakin tietoja. Mitä enemmän pakkaa, sitä enemmän tietoja menetät.
Tämä johtaa niihin hirvittäviin JPEG-tiedostoihin, jotka ihmiset ovat ladanneet, jakaneet ja kuvittaneet useita kertoja. Joka kerta, kun kuva puristuu, se menettää joitakin tietoja.
Tässä on esimerkki. Tämä on kuvakaappaus, jota otin, jota ei ole pakattu ollenkaan.
Sitten otin sen kuvakaappauksen ja juoksin sen läpi Photoshopin useita kertoja, kun vietin sen huonolaatuisena JPEG-muodossa. Tässä on tulos.
Näyttää melko huonolta?
No, tämä on vain pahin skenaario, joka vie aina 0% JPEG-laatua. Vertailun vuoksi tässä on 50% laadukas JPEG, joka on lähes erottamaton lähde-PNG-kuvasta, ellet puhu sitä lähemmäs.
Tämän kuvan PNG-koko oli 200 KB, mutta tämä 50% laadukas JPEG on vain 28 KB.
Miten se säästää niin paljon tilaa? No, JPEG-algoritmi on tekniikan piirre. Useimmat kuvat tallentavat numeroluettelon, jossa jokainen numero edustaa yhtä pikseliä.
JPEG ei tee mitään tästä. Sen sijaan se tallentaa kuvia käyttämällä jotain diskreettistä kosiinimuunnosta, joka on kokoelma siniaalloja, jotka on lisätty yhteen eri intensiteeteillä. Se käyttää 64 erilaista yhtälöä, mutta useimmat näistä eivät käy. Tämä on mitä Photoshopissa ja muissa kuvasovelluksissa laadukkaassa JPEG-liukusäätimessä on, kuinka monta yhtälöä käytetään. Sovellukset käyttävät sitten Huffman-koodausta tiedostokoon pienentämiseksi entisestään.
Tämä antaa JPEG: ille melko korkean pakkaussuhteen, joka voi vähentää tiedostoa, joka olisi useita megatavuja alaspäin pari kilotavua laadusta riippuen. Tietenkin, jos käytät sitä liikaa, päädyt tähän:
Tämä kuva on kamala. Mutta pienillä JPEG-pakkausmäärillä voi olla merkittävä vaikutus tiedostokoon ja tämä tekee JPEG: stä erittäin hyödyllisen kuvien pakkaamiseen verkkosivuilla. Useimmat verkossa näkyvät kuvat pakataan tallennettaviksi latausaikaan, erityisesti mobiilikäyttäjille, joilla on huonot datayhteydet. Itse asiassa kaikki kuvat How-To Geekissa on pakattu, jotta sivujen lataaminen on nopeampaa, ja et todennäköisesti ole koskaan huomannut.
Videon pakkaus
Video toimii hieman eri tavalla kuin kuvissa. Luuletko, että he vain pakaisivat jokaisen videokuvan JPEG: n avulla, ja he varmasti tekevät sen, mutta videolle on parempi tapa.
Käytämme jotakin, jota kutsutaan ”rajapintakompressioksi”, joka laskee kunkin kehyksen väliset muutokset ja tallentaa vain ne. Esimerkiksi, jos sinulla on suhteellisen vielä ammuttu kuva, joka vie useita sekunteja videossa, tallennetaan paljon tilaa, koska pakkausalgoritmilla ei tarvitse tallentaa kaikkia asioita, jotka eivät muutu. Interframe-pakkaus on tärkein syy siihen, että meillä on lainkaan digitaalinen TV ja web-video. Ilman sitä videot olisivat satoja gigatavuja, jotka ovat enemmän kuin keskimääräinen kiintolevyn koko vuonna 2005, kun YouTube käynnisti.
Lisäksi, koska rajapintakompressio toimii parhaiten enimmäkseen paikallaan pysyvän videon kanssa, siksi konfetti pilaa videon laadun.
Huomautus: GIF ei tee tätä, minkä vuoksi animoidut GIF-tiedostot ovat usein hyvin lyhyitä ja pieniä, mutta niillä on kuitenkin melko suuri tiedostokoko.
Toinen asia, joka on pidettävä mielessä videosta, on sen bittinopeus - tietojen määrä, joka on sallittu joka toinen sekunti. Jos bittinopeus on esimerkiksi 200 kb / s, videosi näyttää melko huonolta. Laatu nousee, kun bittinopeus nousee, mutta parin megatavun sekunnin kuluttua saat vähentyneen tuoton.
Tämä on suurennettu kehys, joka on otettu meduusojen videosta. Vasemmalla on 3Mb / s, ja oikealla puolella 100Mb / s.
Tiedoston koon 30-kertainen kasvu, mutta ei laadun parantuminen. Yleensä YouTube-videot istuvat noin 2-10 Mt / s riippuen yhteydestäsi, koska mitään muuta ei todennäköisesti huomaisi.
Tämä demo toimii paremmin todellisen videon kanssa, joten jos haluat tarkistaa sen itse, voit ladata samoja bittinopeuskohteita, joita täällä käytetään.
Äänen pakkaus
Äänen pakkaus toimii hyvin samoin kuin tekstin ja kuvan pakkaaminen. Jos JPEG poistaa yksityiskohdat kuvasta, jota et näe, äänen pakkaus toimii samalla tavalla. Sinun ei ehkä tarvitse kuulla kitaran poimimista merkkijonossa, jos todellinen kitara on paljon, kovempaa.
MP3 käyttää myös bittinopeutta, joka vaihtelee alhaalta 48: sta ja 96 kbps: stä (matala pää) 128: een ja 240 kbps: iin (melko hyvä) 320 kbps: iin (huippuluokan ääni). ja korvat).
On myös häviöttömät pakkauskoodekit, jotka ovat pääasiassa FLAC-ohjelmia, jotka käyttävät LZ77-koodausta täysin häviöttömän äänen tuottamiseksi. Jotkut ihmiset vannovat FLAC: n täydellisen äänenlaadun, mutta MP3-levyn esiintyvyydellä näyttää siltä, että useimmat ihmiset eivät pysty kertomaan eroa.