Cum funcționează compresia fișierelor?
Inginerii de software au dezvoltat întotdeauna noi modalități de a monta o mulțime de date într-un spațiu mic. A fost adevărat atunci când hard drive-urile noastre erau mici, iar apariția internetului tocmai a făcut-o mai critică. Comprimarea fișierelor joacă un rol important în conectarea noastră, permițându-ne să trimitem mai puține date pe linie, astfel încât să putem avea descărcări mai rapide și să se potrivească mai multe conexiuni în rețelele ocupate.
Cum functioneaza??
Pentru a răspunde la această întrebare ar implica explicarea unor matematici foarte complicate, cu siguranță mai mult decât putem acoperi în acest articol, dar nu trebuie să înțelegeți cu exactitate cum funcționează matematic pentru a înțelege elementele de bază.
Bibliotecile cele mai populare pentru comprimarea textului se bazează pe doi algoritmi de compresie, folosindu-se ambele în același timp pentru a obține rate de compresie foarte ridicate. Acești doi algoritmi sunt codificați "LZ77" și "Huffman". Codificarea lui Huffman este destul de complicată și nu vom mai intra în detaliu în legătură cu acesta. În primul rând, folosește niște matematică fantezie pentru a atribui mai scurtă codurile binare la scrisori individuale, diminuarea dimensiunilor fișierelor în proces. Dacă doriți să aflați mai multe despre acest lucru, consultați acest articol cu privire la modul în care funcționează codul sau acest explicator prin Computerphile.
LZ77, pe de altă parte, este relativ simplu și despre care vom vorbi aici. Se caută să elimine cuvintele duplicate și să le înlocuiască cu o "cheie" mai mică care reprezintă cuvântul.
Luați această scurtă piesă de text, de exemplu:
Algoritmul LZ77 ar arăta acest text, își dă seama că repetă de trei ori "howtogeek" și îl schimbă:
Apoi, când vrea să citească textul înapoi, ar înlocui fiecare instanță a (h) cu "howtogeek", care ne aduce înapoi la fraza originală.
Noi numim compresie ca aceasta "fără pierderi" - datele pe care le puneți sunt identice cu datele pe care le obțineți. Nimic nu este pierdut.
În realitate, LZ77 nu folosește o listă de chei, ci înlocuiește a doua și a treia apariție cu un link înapoi în memorie:
Deci, acum, când ajunge la (h), va reveni la "howtogeek" și va citi în schimb.
Dacă sunteți interesat de o explicație mai detaliată, acest videoclip de la Computerphile este destul de util.
Acum, acesta este un exemplu ideal. În realitate, majoritatea textului este comprimat cu chei la fel de mici ca doar câteva caractere. De exemplu, cuvântul "a" ar fi comprimat chiar și atunci când apare cu cuvinte precum "acolo", "lor" și "apoi". Cu text repetat, puteți obține niște rapoarte de compresie nebunești. Luați acest fișier text cu cuvântul "howtogeek" repetat de 100 de ori. Fișierul original este de trei kilobyte. Când este comprimat, totuși, este nevoie doar de 158 de octeți. Aceasta este o comprimare de aproape 95%.
Acum, evident, acesta este un exemplu destul de extrem, deoarece am avut mereu același cuvânt repetat. În practica generală, probabil că veți obține aproximativ 30-40% compresie folosind un format de compresie precum ZIP într-un fișier care este în mare parte text.
Acest algoritm LZ77 se aplică tuturor datelor binare, apropo, și nu doar textului, deși textul este în general mai ușor de comprimat din cauza numărului de cuvinte repetate pe care le folosesc cele mai multe limbi. O limbă precum chinezii ar putea fi un pic mai greu de comprimat decât engleza, de exemplu.
Cum funcționează compresia imaginilor și a videoclipurilor?
Compresia video și audio funcționează foarte diferit. Spre deosebire de textul în care puteți avea compresie fără pierderi și nu pierdeți date, cu imagini avem ceea ce se numește "Compensare în pierdere" unde pierdeți niște date. Și cu cât comprimați mai mult, cu atât veți pierde mai multe date.
Aceasta este ceea ce duce la acele JPEG-uri groaznice, pe care oamenii le-au încărcat, partajat și au fost scanate de mai multe ori. De fiecare dată când imaginea devine comprimată, ea pierde unele date.
Iată un exemplu. Aceasta este o captură de ecran pe care am luat-o, care nu a fost comprimată deloc.
Apoi am luat screenshot-ul și l-am fugit de Photoshop de mai multe ori, de fiecare dată când îl exportam ca un JPEG de calitate scăzută. Iată rezultatul.
Se pare destul de rău, bine?
Ei bine, acesta este doar un scenariu cel mai prost, exportând la calitate JPEG de 0% de fiecare dată. Pentru comparație, iată un JPEG de 50% de calitate, care este aproape indistinguizabil față de imaginea PNG sursă, dacă nu o aruncați în aer și o să vă uitați atent.
PNG-ul pentru această imagine a fost de 200 KB, dar această calitate JPEG de 50% este de numai 28 KB.
Deci, cum salvează atât de mult spațiu? Ei bine, algoritmul JPEG este o operă de inginerie. Majoritatea imaginilor stochează o listă de numere, fiecare număr reprezentând un singur pixel.
JPEG nu face nimic din toate astea. În schimb, stochează imagini folosind ceva numit Transformare discretă a cosinusului, care este o colecție de unde sinusoidale adunate la diferite intensități. Foloseste 64 de ecuatii diferite, dar majoritatea nu se obisnuiesc. Acesta este ceea ce sliderul de calitate pentru JPEG în Photoshop și alte aplicații de imagine nu - alege câte ecuații să le folosiți. Aplicațiile folosesc apoi codificarea Huffman pentru a reduce chiar mai mult dimensiunea fișierului.
Acest lucru oferă JPEG-urilor un raport de compresie insanely ridicat, care poate reduce un fișier care ar fi mai multe megabiți până la câteva kilobyte, în funcție de calitate. Desigur, dacă o folosești prea mult, vei termina cu asta:
Această imagine este oribilă. Dar sumele minore de compresie JPEG pot avea un impact semnificativ asupra dimensiunii fișierului, ceea ce face ca JPEG să fie foarte util pentru compresia imaginilor pe site-uri web. Majoritatea imaginilor pe care le vedeți online sunt comprimate pentru a salva timpii de descărcare, în special pentru utilizatorii de telefonie mobilă cu conexiuni slabe de date. De fapt, toate imaginile despre How-To Geek au fost comprimate pentru a face încărcarea mai rapidă a paginilor și probabil că nu ați observat niciodată.
Compresie video
Video funcționează puțin diferit de imagini. Ați crede că vor comprima fiecare cadru video folosind JPEG și cu siguranță o fac, dar există o metodă mai bună pentru video.
Folosim ceva numit "comprimare inter-cadru", care calculează modificările dintre fiecare cadru și stochează numai acele. Deci, de exemplu, dacă aveți o fotografie relativ inadecvată care durează câteva secunde într-un videoclip, se salvează o mulțime de spațiu deoarece algoritmul de comprimare nu are nevoie să stocheze toate lucrurile în scena care nu se schimbă. Interfața de comprimare este principalul motiv pentru care avem televiziune digitală și video web la toate. Fără aceasta, videoclipurile ar fi sute de gigaocteți, mai mult decât dimensiunea medie a unității hard disk în 2005, când YouTube a lansat.
De asemenea, deoarece compresia interframei funcționează cel mai bine cu cea mai mare parte a imaginii staționare, acesta este motivul pentru care confetti ruinează calitatea video.
Notă: GIF nu face acest lucru, motiv pentru care animatele GIF-uri sunt adesea foarte scurte și mici, dar au încă o dimensiune destul de mare a fișierului.
Un alt lucru care trebuie păstrat în minte cu privire la videoclip este bitrate-cantitatea de date permise în fiecare secundă. Dacă bitrate-ul dvs. este de 200 kb / s, de exemplu, videoclipul dvs. va arăta destul de rău. Calitatea crește odată cu creșterea ratei de biți, dar după câteva megaocteți pe secundă, obțineți un profit redus.
Acesta este un cadru mărit care este luat dintr-un videoclip al unei meduze. Cel din stânga este de 3Mb / s, iar cel din dreapta este de 100Mb / s.
O creștere de 30 de ori a dimensiunii fișierului, dar nu o creștere semnificativă a calității. În general, videoclipurile YouTube se situează în jurul valorii de 2-10Mb / s, în funcție de conexiunea dvs., deoarece nimic mai mult nu va fi probabil observat.
Acest demo funcționează mai bine cu videoclipul real, așa că dacă doriți să îl verificați singur, puteți descărca aceleași videoclipuri de testare bitrate utilizate aici.
Compresie audio
Compresia audio funcționează foarte asemănător cu compresia textului și a imaginii. În cazul în care JPEG elimină detaliile dintr-o imagine pe care nu o veți vedea, compresia audio nu face același lucru pentru sunete. S-ar putea să nu fi nevoie să auziți scârțâitul chitarei de chitară dacă chitara reală este mult mai puternică.
MP3, de asemenea, utilizează bitrate, variind de la sfârșitul scăzut de 48 și 96 kbps (low end) la 128 și 240kbps (destul de bun) până la 320kbps (audio high-end), și probabil veți auzi doar diferența cu căști extrem de bune ( și urechi).
Există, de asemenea, codecuri de compresie fără pierderi pentru audio - cea mai importantă fiind FLAC - care utilizează codarea LZ77 pentru a furniza audio în întregime fără pierderi. Unii oameni jură pe calitatea audio excelentă a FLAC, dar cu prevalența de MP3, se pare că majoritatea oamenilor nici nu pot spune sau nu vă deranjează diferența.