Hvordan virker filkomprimering?
Software ingeniører har altid udviklet nye måder at tilpasse en masse data til et lille rum. Det var sandt, da vores harddiske var små, og fremkomsten af internettet har netop gjort det mere kritisk. Filkomprimering spiller en stor rolle ved at forbinde os, så vi kan sende mindre data ned på linjen, så vi kan få hurtigere downloads og tilpasse flere forbindelser til optagne netværk.
Så hvordan virker det?
At besvare dette spørgsmål ville indebære at forklare nogle meget komplicerede matematik, bestemt mere end vi kan dække i denne artikel, men du behøver ikke at forstå præcist, hvordan det fungerer matematisk for at forstå det grundlæggende.
De mest populære biblioteker til komprimering af tekst er afhængige af to kompressionsalgoritmer, der begge bruges samtidig til at opnå meget høje kompressionsforhold. Disse to algoritmer er "LZ77" og "Huffman-kodning." Huffman-kodning er ret kompliceret, og vi vil ikke komme ind i detaljer om den her. Primært bruger den nogle fancy matematik til at tildele kortere binære koder til individuelle bogstaver, der krymper filstørrelser i processen. Hvis du vil lære mere om det, kan du læse denne artikel om, hvordan koden virker, eller det forklares af Computerphile.
LZ77, derimod, er relativt simpelt og er, hvad vi snakker om her. Det søger at fjerne dobbeltord og erstatte dem med en mindre "nøgle", der repræsenterer ordet.
Tag f.eks. Dette korte stykke tekst:
LZ77-algoritmen vil se på denne tekst, indse, at den gentager "howtogeek" tre gange og ændrer den til dette:
Så, når den vil læse teksten tilbage, erstatter den alle forekomster af (h) med "howtogeek", som bringer os tilbage til den oprindelige sætning.
Vi kalder komprimering som denne "lossless" - de data, du indsender, er de samme som de data, du kommer ud. Intet er tabt.
I virkeligheden bruger LZ77 ikke en liste over nøgler, men erstatter i stedet den anden og tredje forekomst med et link tilbage i hukommelsen:
Så nu, når det kommer til (h), vil det se tilbage til "howtogeek" og læse det i stedet.
Hvis du er interesseret i en mere detaljeret forklaring, er denne video fra Computerphile ret nyttig.
Nu er dette et idealiseret eksempel. I virkeligheden er de fleste tekst komprimeret med nøgler så små som kun få tegn. For eksempel vil ordet "the" blive komprimeret, selv når det vises i ord som "der", "deres" og "derefter". Med gentagen tekst kan du få nogle skøre kompressionsforhold. Tag denne tekstfil med ordet "howtogeek" gentaget 100 gange. Den originale tekstfil er 3 kilobytes i størrelse. Ved komprimering tager det dog kun 158 byte op. Det er næsten 95% kompression.
Nu er det naturligvis et ret ekstremt eksempel, da vi lige havde det samme ord gentaget igen og igen. I almindelig praksis får du sandsynligvis ca. 30-40% kompression ved hjælp af et komprimeringsformat som ZIP på en fil, der hovedsagelig er tekst.
Denne LZ77-algoritme gælder for alle binære data, forresten, og ikke kun tekst, selv om tekst generelt er lettere at komprimere på grund af hvor mange gentagne ord de fleste sprog bruger. Et sprog som kinesisk kan være lidt sværere at komprimere end engelsk, for eksempel.
Hvordan virker billed- og videokomprimering?
Video- og lydkomprimering virker meget anderledes. I modsætning til tekst, hvor du kan have tabsfri komprimering, og ingen data går tabt, har vi billeder, der hedder "Lossy Compression", hvor du taber nogle data. Og jo mere du komprimerer, jo flere data taber du.
Dette fører til de frygtelige udseende JPEG'er, som folk har uploadet, delt og skærmbilleder flere gange. Hver gang billedet bliver komprimeret, taber det nogle data.
Her er et eksempel. Dette er et screenshot, jeg tog, der ikke er blevet komprimeret overhovedet.
Jeg tog så det screenshot og kørte det gennem Photoshop flere gange, hver gang jeg eksporterede det som en lav kvalitet JPEG. Her er resultatet.
Det ser ret dårligt ud?
Nå er det kun et værste tilfælde, der eksporterer med 0% JPEG kvalitet hver gang. Til sammenligning er her en 50% kvalitets JPEG, som næsten ikke kan skelnes fra kilde PNG-billedet, medmindre du blæser det og ser godt ud.
PNG'en for dette billede var 200 KB i størrelse, men denne 50% kvalitets JPEG er kun 28 KB.
Så hvordan sparer det så meget plads? Nå, JPEG algoritmen er en teknisk opgave. De fleste billeder gemmer en liste med tal, hvor hvert nummer repræsenterer en enkelt pixel.
JPEG gør ingen af dette. I stedet lagrer den billeder ved hjælp af noget, der hedder en Diskret Cosine Transform, som er en samling af sinusbølger tilsat sammen i varierende intensiteter. Den bruger 64 forskellige ligninger, men de fleste af disse bliver ikke brugt. Dette er hvad kvalitetsskyderen til JPEG i Photoshop og andre billed apps gør - vælg hvor mange ligninger der skal bruges. Apperne bruger derefter Huffman-kodning for at reducere filstørrelsen endnu mere.
Dette giver JPEG'er et uhyre højt kompressionsforhold, hvilket kan reducere en fil, der ville være flere megabyte ned til et par kilobytes afhængigt af kvaliteten. Selvfølgelig, hvis du bruger det for meget, slutter du med dette:
Det billede er forfærdeligt. Men mindre mængder af JPEG-komprimering kan have en betydelig indvirkning på filstørrelsen, og det gør JPEG meget nyttigt til billedkomprimering på websteder. De fleste billeder, du ser online, komprimeres for at spare på downloadtider, især til mobile brugere med dårlige dataforbindelser. Faktisk er alle billederne på How-To Geek komprimeret for at gøre siden hurtigere, og du har sikkert aldrig lagt mærke til det.
Videokompression
Video fungerer lidt anderledes end billeder. Du ville tro at de bare ville komprimere hver videoramme ved hjælp af JPEG, og de gør det sikkert, men der er en bedre metode til video.
Vi bruger noget kaldet "interframe compression", som beregner ændringerne mellem hver ramme og kun gemmer dem. Så hvis du for eksempel har et relativt stille skud, der tager flere sekunder i en video, bliver meget plads gemt, fordi komprimeringsalgoritmen ikke behøver at gemme alle de ting i den scene, der ikke ændres. Interframe kompression er hovedårsagen til, at vi har digital tv og web video overhovedet. Uden det ville videoer være hundredvis af gigabyte, mere end den gennemsnitlige harddiskstørrelse i 2005, da YouTube blev lanceret.
Da interframe-komprimering fungerer bedst med for det meste stationær video, er det derfor, konfetti ruinerer videokvalitet.
Bemærk: GIF gør ikke dette, og derfor er animerede GIF'er ofte meget korte og små, men har stadig en temmelig stor filstørrelse.
En anden ting at huske på video er dets bitrate-mængden af data tilladt i hvert sekund. Hvis din bitrate er 200 kb / s, vil din video f.eks. Se ret dårlig ud. Kvaliteten går op, da bithastigheden går op, men efter et par megabyte pr. Sekund får du aftagende afkast.
Dette er en zoomet ramme taget fra en video af en vandmænd. Den til venstre er 3Mb / s, og den til højre er 100Mb / s.
En 30x stigning i filstørrelse, men ikke meget stigning i kvalitet. I almindelighed sidder YouTube-videoer omkring 2-10 Mbps afhængigt af din forbindelse, som noget mere sandsynligvis ikke ville blive bemærket.
Denne demo virker bedre med den faktiske video, så hvis du vil tjekke det selv, kan du downloade de samme bitrate testvideoer, der bruges her.
Lydkomprimering
Lydkomprimering fungerer meget på samme måde som tekst- og billedkomprimering. Hvor JPEG fjerner detaljer fra et billede, som du ikke vil se, gør lydkomprimering det samme for lyde. Du behøver måske ikke at høre guitarplukkets knirk på strengen, hvis den faktiske guitar er meget, meget højere.
MP3 bruger også bitrate, lige fra den lave ende på 48 og 96 kbps (den lave ende) til 128 og 240 kbps (temmelig god) til 320 kbps (high-end lyd), og du vil sandsynligvis kun høre forskellen med exceptionelt gode hovedtelefoner ( og ører).
Der er også tabløse komprimeringskoder til lyd - den vigtigste er FLAC - som bruger LZ77-kodning til at levere helt tabsfri lyd. Nogle mennesker sværger ved FLACs perfekte lydkvalitet, men med forekomsten af MP3 ser det ud til, at de fleste enten ikke kan fortælle eller ikke glemme forskellen.