If-Koubou

Jak działa kompresja plików?

Jak działa kompresja plików? (Jak)

Inżynierowie oprogramowania zawsze opracowali nowe sposoby dopasowania dużej ilości danych do małej przestrzeni. To prawda, gdy nasze dyski twarde były małe, a pojawienie się Internetu właśnie sprawiło, że stało się to bardziej krytyczne. Kompresja plików odgrywa dużą rolę w łączeniu nas, pozwalając nam przesyłać mniej danych w dół, dzięki czemu możemy mieć szybsze pobieranie i dopasować więcej połączeń do obciążonych sieci.

Więc jak to działa?

Odpowiedź na to pytanie wymagałaby wyjaśnienia bardzo skomplikowanej matematyki, z pewnością więcej niż możemy opisać w tym artykule, ale nie trzeba dokładnie rozumieć, jak to działa matematycznie, aby zrozumieć podstawy.

Najpopularniejsze biblioteki do kompresowania tekstu opierają się na dwóch algorytmach kompresji, wykorzystując obie jednocześnie w celu uzyskania bardzo wysokich współczynników kompresji. Te dwa algorytmy to "LZ77" i "kodowanie Huffmana". Kodowanie Huffmana jest dość skomplikowane i nie będziemy tutaj szczegółowo omawiać tego. Przede wszystkim używa trochę wymyślnej matematyki, aby przypisać krótsząkody binarne do pojedynczych liter, zmniejszając rozmiary plików w procesie. Jeśli chcesz dowiedzieć się więcej na ten temat, zapoznaj się z tym artykułem o tym, jak działa kod, lub o tym wyjaśniającym z Computerphile.

Z kolei LZ77 jest względnie prosty i o tym tutaj będziemy rozmawiać. Dąży do usunięcia zduplikowanych słów i zastąpienia ich mniejszym "kluczem", który reprezentuje słowo.

Weź ten krótki fragment tekstu, na przykład:

Algorytm LZ77 spojrzałby na ten tekst, zdał sobie sprawę, że trzy razy powtarza "howtogeek" i zmienia go na:

Następnie, gdy chce przeczytać tekst z powrotem, zastąpi każde wystąpienie (h) "howtogeek", przywracając nas do pierwotnej frazy.

Tę kompresję nazywamy "bezstratną" - dane, które umieścisz, są takie same jak dane, które otrzymujesz. Nic nie jest stracone.

W rzeczywistości LZ77 nie używa listy kluczy, ale zamiast tego zastępuje drugie i trzecie wystąpienie odnośnikiem z powrotem w pamięci:

Tak więc teraz, gdy dojdzie do (h), będzie to wyglądać z powrotem do "howtogeek" i zamiast tego czytać.

Jeśli jesteś zainteresowany bardziej szczegółowym wyjaśnieniem, to wideo z Computerphile jest całkiem pomocne.

To jest wyidealizowany przykład. W rzeczywistości większość tekstu jest skompresowana za pomocą klawiszy tak małych, jak tylko kilka znaków. Na przykład słowo "the" zostanie skompresowane nawet wtedy, gdy pojawi się w słowach takich jak "tam", "ich" i "wtedy". Przy powtarzającym się tekście można uzyskać szalone współczynniki kompresji. Weź ten plik tekstowy ze słowem "howtogeek" powtórzonym 100 razy. Oryginalny plik tekstowy ma trzy kilobajty. Po skompresowaniu zajmuje to tylko 158 bajtów. To prawie 95% kompresja.

Oczywiście, jest to dość ekstremalny przykład, ponieważ powtarzaliśmy to samo słowo w kółko. Ogólnie rzecz biorąc, prawdopodobnie uzyskasz około 30-40% kompresji przy użyciu formatu kompresji, takiego jak ZIP, w pliku, który zawiera głównie tekst.

Algorytm LZ77 odnosi się do wszystkich danych binarnych, nawiasem mówiąc, a nie tylko tekstu, choć tekst jest na ogół łatwiejszy do skompresowania ze względu na liczbę powtarzających się słów, których używa większość języków. Język taki jak chiński może być nieco trudniejszy do skompresowania niż angielski, na przykład.

Jak działa kompresja obrazu i wideo?

Kompresja wideo i audio działa bardzo różnie. W przeciwieństwie do tekstu, w którym można uzyskać kompresję bezstratną, a żadne dane nie są tracone, obrazy mają tzw. "Kompresję stratną", w której tracimy dane. Im więcej kompresji, tym więcej tracisz danych.

To właśnie prowadzi do tych okropnie wyglądających plików JPEG, które ludzie wielokrotnie przesłali, udostępnili i zrzutu ekranu. Za każdym razem, gdy obraz jest kompresowany, traci część danych.

Oto przykład. To jest zrzut ekranu, który nie został skompresowany.

Następnie wziąłem ten zrzut ekranu i wielokrotnie przeprowadzałem go w Photoshopie, za każdym razem eksportując go jako JPEG o niskiej jakości. Oto wynik.

Wygląda całkiem źle, prawda?

Cóż, jest to tylko najgorszy możliwy scenariusz, eksportujący przy 0% jakości JPEG za każdym razem. Dla porównania mamy tutaj obraz JPEG o jakości 50%, który jest prawie nie do odróżnienia od źródłowego obrazu PNG, chyba że wysadzimy go i przyjrzymy się bliżej.

PNG dla tego obrazu miał rozmiar 200 KB, ale ten JPEG o jakości 50% ma tylko 28 KB.

Jak więc oszczędzić tak dużo miejsca? Cóż, algorytm JPEG to wyczyn inżynierii. Większość obrazów zapisuje listę numerów, przy czym każda liczba reprezentuje pojedynczy piksel.

JPEG tego nie robi. Zamiast tego przechowuje obrazy przy użyciu czegoś, co nazywa się Discrete Cosine Transform, która jest zbiorem fal sinusoidalnych połączonych ze sobą przy różnych natężeniach. Używa 64 różnych równań, ale większość z nich się nie wykorzystuje. Oto, jaki jest suwak jakości dla JPEG w Photoshopie i innych aplikacjach graficznych - wybierz liczbę równań do wykorzystania. Następnie aplikacje używają kodowania Huffmana, aby jeszcze bardziej zmniejszyć rozmiar pliku.

Daje to JPEG'om niesamowicie wysoki współczynnik kompresji, co może zmniejszyć plik, który w zależności od jakości może zmniejszyć liczbę megabajtów do kilku kilobajtów. Oczywiście, jeśli użyjesz go za dużo, otrzymasz to:

Ten obraz jest okropny. Jednak niewielkie rozmiary kompresji JPEG mogą mieć znaczny wpływ na rozmiar pliku, a to sprawia, że ​​JPEG jest bardzo przydatny do kompresji obrazów na stronach internetowych. Większość zdjęć wyświetlanych online jest kompresowana, aby oszczędzić czas pobierania, zwłaszcza dla użytkowników mobilnych, którzy mają słabe połączenia z danymi. W rzeczywistości wszystkie obrazy w How-To Geek zostały skompresowane, aby ładowanie strony było szybsze i prawdopodobnie nigdy nie zauważyłeś.

Kompresja wideo

Film działa trochę inaczej niż obrazy.Można by pomyśleć, że po prostu kompresują każdą klatkę wideo za pomocą JPEG i na pewno to robią, ale jest lepsza metoda dla wideo.

Używamy czegoś, co nazywa się "kompresją międzyramkową", która oblicza zmiany między każdą ramką i przechowuje je tylko. Na przykład, jeśli masz stosunkowo mało ujęcia, które zajmuje kilka sekund w filmie, dużo miejsca zostanie zapisane, ponieważ algorytm kompresji nie musi przechowywać wszystkich rzeczy w scenie, które się nie zmieniają. Kompresja międzyramkowa jest głównym powodem, dla którego w ogóle mamy telewizję cyfrową i wideo sieciowe. Bez tego filmy byłyby setkami gigabajtów, czyli więcej niż przeciętny rozmiar dysku twardego w 2005 roku, kiedy YouTube zaczął.

Ponadto, ponieważ kompresja międzyramkowa działa najlepiej w przypadku głównie wideo stacjonarnego, dlatego konfetti psuje jakość wideo.

Uwaga: GIF tego nie robi, dlatego animowane GIF-y są często bardzo krótkie i małe, ale wciąż mają dość duży rozmiar pliku.

Inną rzeczą, o której należy pamiętać o wideo, jest jego bitrate - ilość danych dozwolona w każdej sekundzie. Jeśli na przykład Twoja szybkość transmisji bitowej wynosi 200 kb / s, wideo będzie wyglądało dość źle. Jakość rośnie, ponieważ szybkość transmisji rośnie, ale po kilku megabajtach na sekundę uzyskuje się coraz mniejsze zyski.

Jest to powiększona ramka zaczerpnięta z filmu meduzy. Ten po lewej ma prędkość 3 Mb / s, a po prawej 100 MB / s.

30-krotny wzrost rozmiaru pliku, ale nie wzrost jakości. Ogólnie rzecz biorąc, filmy z YouTube mieszczą się w granicach 2-10 Mb / s, w zależności od połączenia, ponieważ nic więcej nie zostanie zauważone.

To demo działa lepiej z rzeczywistym filmem, więc jeśli chcesz to sprawdzić, możesz pobrać te same filmy testowe, które są tutaj używane.

Kompresja dźwięku

Kompresja dźwięku działa bardzo podobnie do kompresji tekstu i obrazu. Gdzie JPEG usuwa szczegóły z obrazu, którego nie zobaczysz, kompresja audio robi to samo dla dźwięków. Nie musisz słyszeć skrzypienia gitary na strunie, jeśli rzeczywista gitara jest dużo, dużo głośniejsza.

MP3 również używa bitrate, począwszy od niskiego końca od 48 do 96 kb / s (low end) do 128 i 240 kb / s (całkiem niezły) do 320 kb / s (high-end audio), a usłyszysz różnicę tylko dzięki wyjątkowo dobrym słuchawkom ( i uszy).

Istnieją również bezstratne kodeki kompresji audio - z których najważniejszym jest FLAC - który używa kodowania LZ77, aby dostarczyć całkowicie bezstratny dźwięk. Niektórzy ludzie przeklinają doskonałą jakość audio FLAC, ale z przewagą MP3, wydaje się, że większość ludzi albo nie może powiedzieć, albo nie ma nic przeciwko różnicy.