Как работи компресирането на файлове?
Софтуерните инженери винаги са разработвали нови начини за поставяне на много данни в малко пространство. Това беше вярно, когато нашите твърди дискове бяха малки и появата на интернет просто я направи по-критична. Компресирането на файловете играе важна роля в свързването ни, като ни позволява да изпращаме по-малко данни надолу по линията, така че да можем да имаме по-бързи изтегляния и да разполагаме с повече връзки на заети мрежи.
И така, как работи?
За да отговорите на този въпрос, трябва да обясните някаква много сложна математика, със сигурност повече, отколкото можем да покрием в тази статия, но не е нужно да разбирате точно как работи математически, за да разберете основите..
Най-популярните библиотеки за компресиране на текст разчитат на два алгоритма на компресия, като използват и двете едновременно, за да постигнат много високи коефициенти на компресия. Тези два алгоритма са "LZ77" и "кодиране на Huffman". Кодирането на Huffman е доста сложно и няма да навлизаме в подробности тук. На първо място, той използва някои фантазия математика, за да възложи по-кратък двоични кодове на отделни букви, намалявайки размера на файловете в процеса. Ако искате да научите повече за него, разгледайте тази статия за това как работи кодът или този обяснител от Computerphile.
LZ77, от друга страна, е сравнително проста и за това ще говорим тук. Той се стреми да премахне дублиращите се думи и да ги замени с по-малък "ключ", който представлява думата.
Вземете този кратък текст, например:
Алгоритъмът LZ77 ще разгледа този текст, осъзнава, че той повтаря три пъти "howtogeek" и го променя на това:
След това, когато иска да прочете текста, той ще замени всеки екземпляр от (h) с „howtogeek“, като ни връща към оригиналната фраза.
Ние наричаме компресия като тази „без загуби” - данните, които въвеждате, са същите като данните, които излизате. Нищо не се губи.
В действителност, LZ77 не използва списък с ключове, а замества втория и третия случай с връзката в паметта:
Така че сега, когато стигне до (h), ще погледне назад към "howtogeek" и ще чете това вместо това.
Ако се интересувате от по-подробно обяснение, този видеоклип от Computerphile е доста полезен.
Сега това е идеализиран пример. В действителност, повечето текстове са компресирани с ключове, само няколко символа. Например, думата “the” ще бъде компресирана дори когато се появява с думи като “там”, “техните” и “тогава”. При повтарящ се текст можете да получите някои луди компресионни коефициенти. Вземете този текстов файл с думата "howtogeek", повторена 100 пъти. Оригиналният текстов файл е с размер от три килобайта. Когато е компресиран обаче, той заема само 158 байта. Това е почти 95% компресия.
Сега, очевидно, това е доста краен пример, тъй като току-що се повтаряше една и съща дума. Като цяло, вероятно ще получите около 30-40% компресия, използвайки формат за компресиране като ZIP на файл, който е най-вече текст.
Този алгоритъм на LZ77 се отнася за всички двоични данни, между другото, а не само за текст, въпреки че текстът обикновено е по-лесно да се компресира, поради това колко много повтарящи се думи използват повечето езици. Език като китайския може да бъде малко по-труден за компресиране от английски например.
Как работи компресирането на изображения и видео?
Видео и аудио компресия работи много по различен начин. За разлика от текста, в който можете да компресирате без загуби, и нямате загуба на данни, с изображенията имаме това, което се нарича "Lossy Compression", където губите някои данни. И колкото повече компресирате, толкова повече данни губите.
Това е, което води до тези ужасно изглеждащи JPEG файлове, които хората са качили, споделили и заснели няколко пъти. Всеки път, когато изображението се компресира, то губи някои данни.
Ето един пример. Това е снимка, която взех, която изобщо не е компресирана.
След това взех тази снимка на екрана и я стартирах през Photoshop няколко пъти, като всеки път го експортирах като JPEG с ниско качество. Ето и резултатът.
Изглежда доста лошо, нали?
Е, това е само сценарий с най-лош сценарий, като всеки път изнасяте при 0% JPEG качество. За сравнение, тук е 50% качество JPEG, което е почти неразличимо от изходния PNG образ, освен ако не го вдигнете и не погледнете отблизо.
PNG за това изображение е с размер 200 KB, но този JPEG с качество от 50% е само 28 KB.
И така, как тя спестява толкова много пространство? Е, алгоритъмът JPEG е подвиг на инженерството. Повечето изображения съхраняват списък с числа, като всеки брой представлява един пиксел.
JPEG не прави нищо от това. Вместо това, той съхранява изображения, използвайки нещо, наречено дискретна косинусна трансформация, която е колекция от синусоидни вълни, събрани в различни интензитети. Той използва 64 различни уравнения, но повечето от тях не се използват. Това е, което слайдерът за качество за JPEG в Photoshop и други приложения за изображения прави - избира колко уравнения да се използват. Приложенията след това използват кодиране на Huffman, за да намалят още повече размера на файла.
Това придава на JPEG-тата много висок коефициент на компресия, който може да намали файла, който би бил с няколко мегабайта до няколко килобайта, в зависимост от качеството. Разбира се, ако го използвате прекалено много, ще получите следното:
Този образ е ужасен. Но незначителните количества JPEG компресия могат да имат значително влияние върху размера на файла, което прави JPEG много полезен за компресиране на изображения на уебсайтове. Повечето снимки, които виждате онлайн, са компресирани, за да спестяват време за изтегляне, особено за мобилни потребители с лоши връзки за данни. Всъщност всички изображения в How-To Geek са компресирани, за да направят зареждането на страниците по-бързо и вероятно никога не сте забелязали.
Видео компресия
Видеото работи малко по-различно от изображенията. Бихте си помислили, че те просто ще компресират всеки кадър от видео, използвайки JPEG, и със сигурност ще направят това, но има по-добър метод за видео.
Ние използваме нещо, наречено "междукадрово компресиране", което изчислява промените между всеки кадър и съхранява само тези. Така например, ако имате сравнително неподвижен кадър, който отнема няколко секунди във видеото, много място се запазва, защото алгоритъмът за компресия не трябва да съхранява всички неща в сцената, които не се променят. Интерфрейм компресията е основната причина да имаме цифрова телевизия и уеб видео изобщо. Без него видеоклиповете ще бъдат стотици гигабайта, повече от средния размер на твърдия диск през 2005 г., когато YouTube стартира.
Също така, тъй като интерфрейм компресията работи най-добре с най-вече стационарно видео, това е причината конфетките да развалят качеството на видеото.
Забележка: GIF не прави това, поради което анимираните GIF файлове често са много кратки и малки, но все още имат доста голям размер на файла..
Друго нещо, което трябва да имате предвид при видеото, е неговият битрейт - количеството данни, разрешено във всяка секунда. Ако вашият битрейт е 200 kb / s, вашето видео ще изглежда доста зле. Качеството се покачва с увеличаване на битрейта, но след няколко мегабайта в секунда получавате намаляваща възвръщаемост.
Това е увеличен кадър, направен от видеоклип на медуза. Едната от лявата страна е 3Mb / s, а тази вдясно е 100Mb / s.
30x увеличение на размера на файла, но не и повишаване на качеството. Като цяло, видеоклиповете на YouTube стоят около 2-10Mb / s в зависимост от връзката ви, тъй като нещо повече вероятно няма да бъде забелязано.
Тази демонстрация работи по-добре с действителното видео, така че ако искате да я проверите сами, можете да изтеглите същите тестови видеоклипове, използвани тук.
Компресия на звука
Аудио компресията работи много подобно на компресирането на текст и изображения. Когато JPEG премахне детайлите от изображение, което няма да видите, аудио компресията прави същото за звуци. Може да не ви се налага да чувате скърцането на китара, ако действителната китара е много, много по-силна.
MP3 използва и битрейт, вариращ от нисък край на 48 и 96 kbps (нисък край) до 128 и 240kbps (доста добър) до 320kbps (висок клас аудио), и вероятно ще чуете разликата само с изключително добри слушалки ( и уши).
Има и кодеци за компресиране без загуби на звук - главното е FLAC, което използва LZ77 кодиране, за да достави изцяло аудио без загуби. Някои хора се кълнат в перфектното аудио качество на FLAC, но с преобладаването на MP3, изглежда, че повечето хора или не могат да кажат или не се интересуват от разликата.