H.264 решает простую проблему: несжатое видео занимает неприлично много места. Ролик 1080p с частотой 60 кадров в секунду требует около 370 МБ данных каждую секунду. Даже диска Blu-ray на 50 ГБ хватило бы примерно на две минуты. Чтобы такое видео можно было хранить и передавать, пришлось научиться выбрасывать всё лишнее.
Первый приём — квантование. Изображение переводят в частотную область, где плавные перепады яркости отделены от мелких деталей. Тонкую сетку, шероховатости и шум можно ослабить без заметной потери смысла картинки. Глаз всё равно не заметит большинства таких изменений, зато данных останется в разы меньше.
Второй трюк связан с цветом. Человек гораздо лучше различает яркость, чем тонкие цветовые оттенки. Поэтому яркостную составляющую сохраняют в полном разрешении, а цветовую — в уменьшенном. Это называется chroma subsampling и позволяет примерно вдвое уменьшить объём цветовой информации.
Дальше начинается работа со временем. H.264 не хранит каждый кадр как самостоятельную фотографию. Полные I-frame встречаются лишь изредка. Между ними лежат P-frame и B-frame, которые описывают, куда сдвинулись блоки изображения. Если камера неподвижна, кодек сохраняет фон один раз и записывает только движение мяча, человека или курсора. Поэтому перемотка назад иногда задерживается: декодеру приходится вернуться к ближайшему полному кадру и заново восстановить цепочку.
Напоследок энтропийный кодер без потерь убирает повторы в оставшихся данных. В примере из статьи пятисекундное видео весом 1,2 ГБ ужалось до 175 КБ. Это не одна хитрость, а целый набор согласованных решений, отработанных десятилетиями.
Особенно нагляден контраст с PNG: триста кадров видео заняли 175 КБ, тогда как один кадр в PNG — больше мегабайта. При этом визуально ролик почти не отличался от исходника.