Содержание статьи +
- Кратко
- Почему это важно
- Пайплайн на одной картинке
- Этап 1 – Захват: источник редко безупречен
- Этап 2 – Предобработка: ресайз и цвет, где происходит тихий ущерб
- Этап 3 – Кодирование: знаменитый этап и что он на самом деле выбрасывает
- Этап 4 – Упаковка: лестница битрейтов и потеря поколений
- Этап 5 – Доставка: где картиночная метрика слепнет
- Этап 6 – Декодирование: обычно честное, иногда нет
- Этап 7 – Отображение: последняя миля до глаза
- Вся цепочка одним взглядом
- Что меняет ИИ-апскейл, а что нет
- Где здесь Фора Софт
- Главное
- Что почитать дальше
Кратко
Видео теряет качество во множестве точек между камерой и глазом зрителя, а не только в кодере, которого все винят. Цепочка идёт: захват → предобработка → кодирование → упаковка → доставка → декодирование → отображение, и почти каждый шаг что-то выбрасывает: шумящий сенсор, даунскейл, теряющий детали, шаг квантования внутри кодека, слишком агрессивная лестница битрейтов, сетевая заминка, экран, который не способен показать то, что было отправлено. Самая полезная мысль этой статьи: потеря накапливается и однонаправленна – если деталь ушла, ни один следующий этап не вернёт её по-настоящему, поэтому единственный способ починить качество – найти этап, где оно реально утекло. Это карта, к которой остальной раздел «Качество и измерение видео» возвращается снова и снова, и она же подсказывает, какая метрика вообще способна увидеть тот или иной вид потери.
Почему это важно
Когда поток выглядит плохо, виноватым назначают кодер – потому что кодирование все могут назвать по имени. Но потеря часто произошла ещё до кодера, в небрежном ресайзе или шумном захвате, или уже после него – в сети, которая зависла, или в телевизоре, растянувшем низкую ступень на свою панель. Если вы выбираете кодек, настраиваете лестницу битрейтов, разбираете тикет «почему это мыльно?» или решаете, какой метрике верить, вам нужна модель того, где утекает качество и обратима ли каждая утечка. Эта статья даёт такую карту, чтобы разборы PSNR, VMAF, артефактов и стриминговой QoE легли каждый на своё место.
Пайплайн на одной картинке
Каждое доставленное видео проходит один и тот же путь, даже если часть этапов вам не видна. Камера захватывает свет в пиксели. Программа предобрабатывает их – меняет размер, шумоподавляет, конвертирует цвет. Кодер сжимает результат в небольшой битстрим. Упаковщик перекодирует его в несколько вариантов адаптивной лестницы. Сеть доставляет выбранный вариант. Устройство декодирует его обратно в пиксели. Экран отображает их. Глаз зрителя – финальный судья.
Каждый этап существует не просто так, и большинство из них меняют немного качества на что-то другое: меньший файл, меньший битрейт, поток, который переживёт слабое соединение. Задача измерения – не делать вид, что обмена нет (он обязан быть), а знать, где происходит каждый обмен, сколько он стоит и потратили ли вы это качество осознанно.
Держите одно правило выше всех деталей ниже: качество, потерянное на любом этапе, не восстанавливается следующим этапом. Последующий шаг может скрыть дефект или придумать правдоподобные новые детали, но не может дотянуться назад и вернуть информацию, которую выбросил предыдущий шаг. Вот почему вопрос «где потеряли?» важнее, чем «как подрезкость в конце?».
Этап 1 – Захват: источник редко безупречен
Первый сюрприз для многих команд – «оригинал» уже несовершенен. Если вы не работаете со студийным мастером, камера не отдала вам запись без потерь. Телефон или веб-камера сжимают видео прямо при записи, кодируя выход сенсора в гораздо более низкий битрейт ещё до того, как файл коснётся диска. Так что файл, который вы считаете эталоном, сам по себе – сжатый артефакт с потерями.
Здесь качество стоят два механизма. Первый – шум сенсора: при слабом свете или на дешёвом сенсоре картинка приходит зернистой, и эта зернистость – случайная деталь, которую камера не отличает от реальной текстуры. Второй – кодек захвата: встроенный в камеру кодер уже квантовал информацию, чтобы попасть в свой битрейт. Шум ухудшает и следующие этапы: случайное зерно дорого сжимать, оно отбирает биты у настоящей картинки, поэтому шумный захват тихо опускает потолок качества для всего, что идёт дальше.
Для измерения это важно, потому что самые частые метрики – PSNR, SSIM, VMAF – full-reference: они оценивают кодирование относительно «оригинала». Если оригинал – шумный захват с телефона, метрика измеряет верность дефектному источнику, а не реальности. Для прямого эфира, видеозвонков и пользовательских клипов эталонного мастера нет вовсе – и именно поэтому существует измерение без эталона.
Этап 2 – Предобработка: ресайз и цвет, где происходит тихий ущерб
Перед кодированием видео почти всегда переформируют. Это этап, который наносит больше всего незачтённого ущерба, потому что выглядит как нейтральная рутина.
Масштабирование (изменение разрешения) – главный из них. Даунскейл – скажем, 4K в 1080p – обязан выбросить пиксели, а большая часть визуальной детали живёт в высоких пространственных частотах, как раз в той части, которую фильтр даунскейла убирает, чтобы избежать алиасинга. Арифметика прямая: кадр 1920×1080 содержит 1920 × 1080 = 2 073 600 пикселей, а кадр 640×360 – 640 × 360 = 230 400. То есть 230 400 ÷ 2 073 600 ≈ 0,111, значит вариант 360p сохраняет примерно одну девятую пикселей и выбрасывает около 89% из них. Апскейл – зеркальная проблема: растягивание 360p обратно в 1080p придумывает пиксели интерполяцией, но не может вернуть выброшенную деталь, поэтому выглядит мыльно. Выбор фильтра важен – swscale в FFmpeg предлагает bicubic, lanczos и другие, меняя резкость на звон, – но ни один фильтр не вернёт то, что даунскейл удалил.
Цветовая субдискретизация (chroma subsampling) – потеря, которую почти никто не замечает, что выбирает. Поскольку глаз видит детали яркости куда резче, чем детали цвета, видео хранит яркость (luma) в полном разрешении, а цвет (chroma) – в пониженном. Распространённая схема 4:2:0 уменьшает разрешение chroma вдвое и по горизонтали, и по вертикали. Посчитайте отсчёты: в полном 4:4:4 на четыре пикселя приходится 4 luma + 4 Cb + 4 Cr = 12 отсчётов; в 4:2:0 – 4 luma + 1 Cb + 1 Cr = 6 отсчётов. Chroma падает с 8 отсчётов до 2 – срез цветовой информации на 75% – а суммарные данные уменьшаются вдвое, с 12 до 6. На лицах и пейзажах вы этого не увидите; на насыщенном красном тексте или резких цветовых границах это проявляется как растекание цвета. Механика цвета со стороны причины живёт в разделе Video Encoding; здесь же суть в том, что это решение о качестве, принятое ещё до запуска кодера.
Ещё два шага предобработки стоят качества намеренно. Шумоподавление осознанно удаляет деталь – то самое зерно с Этапа 1, – потому что чистый вход сжимается куда лучше; настроенное хорошо, оно в плюс, настроенное плохо – смазывает настоящую текстуру. Конвертация частоты кадров отбрасывает или смешивает кадры (60 → 30 fps вдвое уменьшает временные отсчёты), что вносит рывки, разобранные в галерее артефактов.
Этап 3 – Кодирование: знаменитый этап и что он на самом деле выбрасывает
Теперь этап, который знают все. Видеокодер уменьшает файл, эксплуатируя избыточность – повторы внутри кадра (пространственные) и между кадрами (временные), – но теряет качество один конкретный шаг: квантование.
Вот механизм простыми словами. Кодер преобразует каждый блок пикселей в частотные коэффициенты дискретным косинусным преобразованием (DCT), затем делит эти коэффициенты на шаг и округляет. Округление – это место, где информация исчезает, и оно необратимо: число нельзя «разокруглить». Грубость округления задаёт параметр квантования (QP). В H.264 и HEVC QP идёт от 0 до 51 для 8-битного видео, и размер шага удваивается с каждым приростом QP на 6, так что QP 28 квантует вдвое грубее, чем QP 22. Выше QP – меньше файл и больше потерь; ниже QP – больше файл и меньше потерь. Всё, что кодер делает, чтобы «улучшить качество на данном битрейте», под капотом – более умный способ потратить биты так, чтобы неизбежное округление пришлось туда, где глаз заметит его меньше всего.
Это округление – источник классических артефактов сжатия: блочности (сетка DCT становится видна, когда коэффициенты раздавлены), звона вокруг резких краёв и полошения на гладких градиентах. Каждому посвящена своя статья в галерее артефактов; запомните связь: это симптомы квантования, а не случайные глитчи. Как кодек решает, куда тратить биты, – тема раздела Video Encoding; этот раздел измеряет результат.
«Частая ошибка: винить кодер за потерю выше по цепочке. Когда поток 1080p выглядит мыльно, рефлекс – поднять битрейт или сменить кодек. Но если мыло пришло от плохого даунскейла, шумного захвата или растекания цвета 4:2:0, никакие лишние биты кодера не вернут деталь, которая ушла ещё до кодера. Всегда спрашивайте «это потеряли выше по цепочке?» прежде, чем крутить кодек.»
Этап 4 – Упаковка: лестница битрейтов и потеря поколений
Стриминг отгружает не один файл. Он отгружает адаптивную лестницу битрейтов (ABR) – тот же контент, перекодированный в несколько ступеней разрешения-и-битрейта (например, 1080p на 5 Мбит/с вниз до 360p на 0,6 Мбит/с), чтобы плеер переключал ступени по мере изменения сети. Как строится лестница, разобрано в per-title и per-shot кодировании; здесь важно её следствие для качества.
На этом этапе появляются две потери. Во-первых, нижние ступени низкокачественны по замыслу – 360p на 0,6 Мбит/с это худшая картинка в наборе, и именно её получают зрители на слабых соединениях, которые потом судят обо всём вашем сервисе по ней. Во-вторых, потеря поколений: каждый раз, когда видео декодируется и перекодируется кодеком с потерями, новый проход квантует ещё информации поверх того, что уже убрал предыдущий проход. Перекодирование из уже сжатого промежуточного файла – а не из мастера наивысшего качества – складывает потерю на потерю. Один чистый транскод на разумном битрейте незаметен; цепочка из трёх-четырёх – нет. Правило: всегда перекодировать из лучшего доступного источника, никогда – из предыдущего вывода.
Этап 5 – Доставка: где картиночная метрика слепнет
До сих пор каждая потеря была пространственной – меньше пикселей, грубее цвет, раздавленные коэффициенты, – и full-reference картиночная метрика на закодированном файле видит их все. Доставка иная. Она ухудшает опыт так, как сам файл картинки никогда не фиксирует, – и потому это этап, который обманывает команды, измеряющие только PSNR или VMAF.
Доминируют две потери доставки. Когда падает полоса, адаптивный стриминг переключается на ступень ниже, и зритель внезапно получает мыльную 360p вместо чёткой 1080p – реальное падение качества, случившееся в сети, а не в кодере. Когда буфер пустеет быстрее, чем наполняется, воспроизведение встаёт: тот самый спиннер, событие ребуферинга, замороженное время. У замороженного кадра идеальное «качество картинки» и ужасный опыт. Есть ещё задержка старта – время до первого кадра – прежде чем зритель вообще что-то увидит.
Это потери Quality of Experience (QoE), и они невидимы для метрики, оценивающей пиксели относительно эталона. В этом сердце различия QoE против QoS: сеть может доставить каждый байт корректно (хорошая Quality of Service) и всё равно дать жалкий просмотр, если доставит их поздно. Стандарт это признаёт прямо. Рекомендация ITU-T P.1203 (10/2017) моделирует качество сессии адаптивного стриминга, складывая три деградации в один Mean Opinion Score: сжатие с потерями, пространственное или временное уменьшение разрешения и заминки от ребуферинга, включая начальную загрузку. Стандарт, которому приходится суммировать сжатие и заминки, чтобы предсказать опыт, – официальное подтверждение, что доставка теряет качество, которого кодер не касался.
Цифры подтверждают вес этих потерь. Аналитики стриминга из Conviva сообщали, что зрители начинают уходить, когда старт превышает примерно две секунды, а уход резко ускоряется после пяти секунд; исследования QoE неоднократно связывали ребуферинг с уходом зрителя сильнее, чем любую разницу в качестве картинки. Мы измеряем это специальными стриминговыми метриками – доля ребуферинга, время старта, частота переключений битрейта – в Блоке 6. Поскольку у прямого эфира и пользовательского видео нет мастера для сравнения, для оценки их доставленной картинки нужны метрики без эталона.
Этап 6 – Декодирование: обычно честное, иногда нет
Декодирование – единственный этап, который в нормальном стриминге практически не добавляет новых потерь. Совместимый декодер детерминирован: получив битстрим, который произвёл кодер, он восстанавливает ровно те отсчёты, на которые кодер решился. Качество уже определено выше по цепочке; декодер просто верно его воспроизводит. Так что для видео-по-запросу и адаптивного стриминга по надёжному транспорту (HTTP/TCP) декодирование можно считать нейтральным к качеству.
Исключение – ненадёжный транспорт. В протоколах реального времени для видеозвонков и части прямых эфиров пакеты могут теряться в пути. Тогда декодер не может восстановить недостающие данные и переходит к сокрытию ошибок (error concealment) – угадывает потерянную область по соседним пикселям или предыдущему кадру. Эта догадка даёт смазы, заморозки или вспышки искажений. Это потеря доставки, проявляющаяся на декодере, и поэтому стриминговые артефакты выглядят иначе, чем артефакты сжатия.
Этап 7 – Отображение: последняя миля до глаза
Финальный этап – экран, и он может тихо ограничить всё, что пайплайн старался сохранить. У панели фиксированы разрешение, пиковая яркость, цветовой охват и битовая глубина. Если дисплей не способен воспроизвести закодированный диапазон яркости или цвета – например, показывая HDR-контент на обычной панели, – он вынужден тон-маппить сигнал вниз, сжимая света и сдвигая цвет, теряя деталь, которую битстрим реально нёс. Многие дисплеи ещё и апскейлят: телевизор, показывающий ступень 360p, растягивает её на 4K-панель, добавляя собственную интерполяционную мягкость поверх и без того низкого разрешения ступени.
Дальше – окружение зрителя. Один и тот же файл выглядит иначе на телефоне под ярким солнцем и на откалиброванном мониторе в тёмной комнате. Это не дефект файла – именно поэтому субъективные тесты фиксируют дисплей, расстояние и освещение, чтобы оценки что-то значили, как задано в Рекомендации ITU-R BT.500-15 и Рекомендации ITU-T P.910 (2023). Воспринимаемое качество – произведение сигнала и условий, в которых его смотрят.
Вся цепочка одним взглядом
Читайте эту таблицу как карту всего раздела. Каждая строка – этап, потеря, которую он вызывает, можно ли её отменить позже (почти никогда) и как её вообще обнаружить.
| Этап | Как теряется качество | Восстановимо позже? | Как поймать |
|---|---|---|---|
| Захват | Шум сенсора; сжатие в камере | Нет | Метрики без эталона; осмотр источника |
| Предобработка | Даунскейл роняет детали; 4:2:0 режет цвет; шумодав смазывает | Нет | Сравнение с источником; full-reference |
| Кодирование | Квантование округляет коэффициенты (блочность, полосы, звон) | Нет | PSNR, SSIM, VMAF против источника |
| Упаковка | Низкие ступени лестницы; потеря поколений от перекодирований | Нет | Метрика по каждой ступени против мастера |
| Доставка | Переключение вниз; заминки ребуферинга; задержка старта | Частично (перезапрос) | QoE-метрики: доля ребуферинга, старт |
| Декодирование | Нет при надёжном транспорте; сокрытие ошибок при потере пакетов | Нет | Без эталона; мониторинг потерь пакетов |
| Отображение | Пределы панели; тон-маппинг HDR→SDR; апскейл дисплея | Нет | Тест на устройствах; контроль условий |
Таблица 1. Карта потери качества. Столбец «восстановимо» – это и есть соль: с узким исключением перезапроса доставленных данных каждая потеря необратима, поэтому качество выигрывают или проигрывают, предотвращая утечки, а не ремонтируя их.
Закономерность трудно не заметить: потеря накапливается и почти никогда не разворачивается. Мастер 4K, который уменьшили, закодировали на высоком QP, сбросили на низкую ступень лестницы и показали на телефоне, прошёл через пять отдельных вычитаний, каждое усиливает предыдущее. Если нарисовать «оставшееся качество» вдоль цепочки, получится лестница, которая только шагает вниз.
Что меняет ИИ-апскейл, а что нет
Справедливое возражение: разве ИИ-апскейлеры и сверхразрешение не ломают правило «нельзя вернуть потерянное качество»? Не совсем, и различие – то же разделение верности и восприятия, что и в открывающей статье. Обученная модель может выдать кадр, который выглядит резче и приятнее деградированного входа, придумав правдоподобную деталь – высокое воспринимаемое качество. Но придуманная деталь – уверенная догадка, а не информация, которую выбросил пайплайн, поэтому верность настоящему оригиналу остаётся низкой. Это по-настоящему полезно для просмотра и по-настоящему обманчиво для измерения, и живёт в разделе AI for Video Engineering. Правило держится: оригинальная деталь ушла; модель закрасила пробел.
Где здесь Фора Софт
Фора Софт строит видеопродукты с 2005 года – стриминг, WebRTC-конференции, OTT, онлайн-обучение, телемедицину и видеонаблюдение, – и в каждом жалоба на качество, что ложится на стол, почти никогда не называет настоящий этап. Мы относимся к «видео выглядит плохо» как к вопросу о пайплайне, а не о кодере: проверяем, пришла ли потеря из захвата, даунскейла предобработки, кодирования, лестницы, сети или дисплея, потому что каждому нужен свой ремонт и только один из них – кодек. Дисциплина в том, чтобы измерять более чем на одном этапе – full-reference картиночные метрики там, где есть мастер, QoE-метрики на всей доставке, – чтобы разговор сместился от «выглядит плохо» к «потеряли шесть пунктов VMAF на даунскейле и дважды зависли на 4G», а это уже проблема, которую реально починить.
Главное
- Качество теряется по всему пайплайну, а не только в кодере.
- Потеря накопительна и однонаправленна – ни один следующий этап её не вернёт.
- Предобработка (даунскейл, 4:2:0) наносит тихий ущерб до кодирования.
- Квантование (ручка QP) – это и есть шаг потери в кодере.
- Потери доставки – заминки, переключения – невидимы для картиночных метрик.
- Найдите этап, где утекло, прежде чем крутить кодек.