Как устроено сжатие с потерями
easy

Как устроено сжатие с потерями

Благодаря этому у нас есть стримы и ютуб.

Недавно мы рассказывали про сжатие данных без потерь. Смысл в том, что существуют некие алгоритмы, которые позволяют уложить данные более компактно и передать их другому человеку, не потеряв ни байта.

Часто сжатия без потерь недостаточно. Сегодня поговорим о сжатии с потерями.

Чем отличается от сжатия без потерь

При таком сжатии мы теряем часть информации. Но смысл алгоритмов сжатия в том, чтобы мы этого не замечали: сжатие должно происходить так, чтобы всё важное передалось, а неважное — нет. 

Можно представить, что мы говорим с человеком по телефону. Его голос немного искажён, может прерываться или немного сбоить. Но если мы смогли понять собеседника, то нам достаточно такого качества. При этом мы можем не расслышать какие-то нюансы, не ощутить всю глубину баса или не оценить все оттенки интонаций, но это нам и неважно. Разговор по телефону — это пример передачи информации с использованием сжатия с потерями. 

Сжатие фотографий

Есть алгоритм сжатия для фотографий, который используют для изображений типа JPEG. В этом алгоритме изображение разделяется на один слой яркости и два слоя цвета (если упрощённо, то картинка разделяется, на чёрно-белый слой и на слой с красками).

Из Википедии: Цветное изображение и его компоненты Y, CB и CR

Эти слои нарезаются на квадраты 8 × 8 пикселей и кодируются с помощью особой математики. Её смысл в том, чтобы понять: есть ли в этом квадрате 8 × 8 что-то важное. Если оно есть, то оно кодируется и данные сохраняются. Если квадрат более-менее однородный, то он записывается как однородный, данных мало. 

Экономия данных происходит как раз за счёт этой математики: например, если в квадрат 8 × 8 попал кусочек ясного неба, то там достаточно сказать «весь кусок такого-то синего цвета», и тогда нужно хранить немножко данных. А если на квадрат пришёлся какой-то угол или деталь, то данных нужно сохранить больше. 

А если у вас картинка нарезана отдельно на яркость и отдельно на цвет, вы экономите ещё больше данных: в слое с яркостью у вас будут все контрастные детали, а в цветовых слоях — плавные цветовые переливы. Плавные переливы легче закодировать, это будет незаметно для глаза. 

Сжатие JPEG идеально подходит для фотографий, где размер деталей намного больше, чем размер пикселей. 

Возьмём странное изображение винограда на ржавой трубе. Найдите различия между двумя картинками:

Слева — оригинал, справа изображение сжато в 20 раз. Визуально разницу заметить трудно.

Теперь сожмём оригинал в 415 раз: было 10 мегабайт, стало 24 килобайта. При этом мы всё равно понимаем, что на фотографии — виноград с плодами на ржавой трубе. Наш мозг сглаживает эти неровности и узнаёт картинку.

Справа уже видны пиксели и размытость — это побочные явления сильного сжатия.

Хуже всего JPEG подходит для сжатия изображений, в которых есть мелкие детали, острые края и резкие контрасты. Особенно — если изображения мелкие. Тогда алгоритмы JPEG создают слишком много артефактов. Дизайнеры говорят, что картинку зашакалило (от слова «шакал»):

Убейте меня

Сжатие звука

Существуют алгоритмы сжатия для аудиозаписей. Их смысл в том, чтобы не кодировать ту часть данных, которая не особо влияет на восприятие аудиосигнала.

Например, человеческое ухо в среднем воспринимает звуки частотой от 20 герц до 20 килогерц. 20 Гц — это супергрудной бас, а 20 КГц — это супертонкий писк. Чтобы закодировать волну с максимальной частотой 20 КГц, на каждую секунду вам нужно 40 тысяч чисел размером 2 байта. Получается, что секунда несжатого звука будет занимать 80 килобайт.

Но содержательная часть человеческого голоса (та, в которой зашита вся информация) заканчивается на 4000 герцах. Если отрезать у голоса всё, что выше 4000 герц, вы запросто различите смысл слов и поймёте интонацию. Пропадёт лишь некоторая «воздушность» звука. Если нет цели сделать суперкрутой звук, то алгоритмам нет смысла кодировать диапазон 4—20 КГц. 

Тогда из звука отсекается лишняя информация и кодируется только диапазон до 4 КГц. Для этого кодирования достаточно 16 килобайт в секунду. Это уже экономия в 5 раз!

Самая важная часть голоса вообще болтается в районе 1000—2000 герц. Если отрезать у голоса всё от 2 до 20 КГц, то нам хватит 8 КБ в секунду, а это экономия в 10 раз по сравнению с несжатым файлом. 

Сравните три варианта аудио: сначала несжатый вариант, потом сжатый в 6 раз, наконец — в 160 раз:

При таком сжатии существенно «съедаются» верхние частоты, но оно и понятно: на их кодирование компьютеру нужно в несколько раз больше данных, чем на кодирование основной информационной нагрузки аудиофайла. 

Когда вы говорите по телефону, ваш голос сжимается в несколько сотен раз, потому что телефонный разговор заточен только под частоты голоса. Поэтому любая музыка в телефонной трубке звучит так погано. 

Сжатие видео

Чтобы сжать видео, используют комбинацию сжатия картинок и звука. И есть один дополнительный момент: сжатие только изменяющихся частей кадра. Как это работает: 

  1. В одной секунде видео 25 кадров
  2. Если за секунду в кадре ничего особо не произошло, то это будут 25 примерно одинаковых картинок
  3. Алгоритму нет смысла кодировать каждую картинку с нуля. Он возьмёт одну картинку как отправную точку, во всех следующих закодирует только изменения по сравнению с предыдущим кадром
  4. В зависимости от того, насколько мы хотим качественную картинку на выходе, мы можем задавать степень чувствительности алгоритма: от «кодируй, только если в кадр залетит ракета» до «реагируй на мельчайшие изменения в кадре». Чем более чуткий кодировщик, тем больше весит файл.

Пример кодирования одной и той же сцены с разной чувствительностью  — на видео она отображена в килобитах в секунду. Чувствительность влияет на итоговый размер видеофайла:

Стримы и потоковое видео

В потоковом видео ситуация усугубляется тем, что данные нужно передавать миллионам людей как можно скорее. Поэтому, помимо того чтобы сжимать видео, стриминговые сервера ещё и меняют его физический размер, то есть из большой картинки делают маленькую.

Размеры кадров в таких видео часто измеряются в «строках» — это те самые числа возле буквы p:

  • 144p — кадр состоит из 144 строк, то есть его высота — 144 пикселя
  • 480p — кадр высотой 480 пикселей
  • 1080p — кадр высотой 1080 пикселей

Соответственно, чем выше кадр, тем он шире; тем больше размер изображения; тем больше деталей в него влезает.

Самое низкое качество, которое есть в потоковом видео — 144p. Мутная картинка и пиксели, зато можно смотреть даже с медленным интернетом
То же самое видео в формате HD или 1080p — можно прочитать даже мелкие надписи в интерфейсе игры, запущенной на умных часах. Но для этого нужен быстрый интернет

Буква p в 1080p означает progressive — то есть кодируется каждая строка видеофайла. А бывает ещё буква i, которая означает interlaced. Это значит, что в одном кадре кодируются каждые чётные строки, а в следующем — каждые нечётные. Потом их объединяют в одной картинке, и если не знать, куда смотреть, то можно не заметить подвоха.

Межстрочное сжатие будет хорошо видно, если в кадре что-то движется. Вы заметите характерные «полоски» и задвоение изображения:

Машина кажется раздвоенной, потому что в одном кадре она была левее, в другом — правее, а потом эти два кадра соединили в одном, используя чересстрочное кодирование

И что нам с этим делать

Да ничего особо. Радоваться, что в наше время можно смотреть потоковое видео в прямом эфире с телефона в разрешении 1080p через сотовую вышку, пользуясь роскошным сжатием и широкополосным доступом в интернет.

Текст и скриншоты

Михаил Полянин


Редактура и тоже скриншоты

Максим Ильяхов


Художник

Даня Берковский


Корректор

Ирина Михеева


Вёрстка

Мария Дронова


Соцсети

Олег Вешкурцев

Алгоритмы — основа разработки
Изучите алгоритмы, чтобы легко проходить ИТ-собеседования и делать более совершенный софт. Старт — бесплатно. После обучения — помощь с трудоустройством.
Новый уровень тут
Алгоритмы — основа разработки Алгоритмы — основа разработки Алгоритмы — основа разработки Алгоритмы — основа разработки
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Как работает беспроводная зарядка
Как работает беспроводная зарядка

Всё дело в магнитном поле.

easy
Зачем нужны парсеры
Зачем нужны парсеры

И как стащить с сайта что угодно.

medium
Какие бывают хостинги

Выделенный сервер, VPS, KVM, VDS и прочие умные слова.

medium
ColdFusion — редкий и важный язык программирования
ColdFusion — редкий и важный язык программирования

Один из первых серверных языков, который смог найти себе место в современном мире.

easy
Мощь алгоритмов: автоматический поиск всех возможных комбинаций
Мощь алгоритмов: автоматический поиск всех возможных комбинаций

Сдвигаем парадигму с помощью силы компьютеров

medium
Что такое JSON
Что такое JSON

Храним все данные на сервере и получаем их в нужный момент.

easy
Асимметричное шифрование
Асимметричное шифрование

Сложное, но очень полезное.

medium
Чем отличается JavaScript и Python от C++ и Swift
Чем отличается JavaScript и Python от C++ и Swift

Про скрипты и компиляторы — в картинках

easy
Что такое «безголовый Хром» и за что его любят разработчики
Что такое «безголовый Хром» и за что его любят разработчики

Браузер, который никто не видит

easy
easy