Где теряется качество видео в пайплайне

Автор: Николай СапуновОбновлено: август 202616 мин чтения
Содержание статьи +

Кратко

Видео теряет качество во множестве точек между камерой и глазом зрителя, а не только в кодере, которого все винят. Цепочка идёт: захват → предобработка → кодирование → упаковка → доставка → декодирование → отображение, и почти каждый шаг что-то выбрасывает: шумящий сенсор, даунскейл, теряющий детали, шаг квантования внутри кодека, слишком агрессивная лестница битрейтов, сетевая заминка, экран, который не способен показать то, что было отправлено. Самая полезная мысль этой статьи: потеря накапливается и однонаправленна – если деталь ушла, ни один следующий этап не вернёт её по-настоящему, поэтому единственный способ починить качество – найти этап, где оно реально утекло. Это карта, к которой остальной раздел «Качество и измерение видео» возвращается снова и снова, и она же подсказывает, какая метрика вообще способна увидеть тот или иной вид потери.

Почему это важно

Когда поток выглядит плохо, виноватым назначают кодер – потому что кодирование все могут назвать по имени. Но потеря часто произошла ещё до кодера, в небрежном ресайзе или шумном захвате, или уже после него – в сети, которая зависла, или в телевизоре, растянувшем низкую ступень на свою панель. Если вы выбираете кодек, настраиваете лестницу битрейтов, разбираете тикет «почему это мыльно?» или решаете, какой метрике верить, вам нужна модель того, где утекает качество и обратима ли каждая утечка. Эта статья даёт такую карту, чтобы разборы PSNR, VMAF, артефактов и стриминговой QoE легли каждый на своё место.

Пайплайн на одной картинке

Каждое доставленное видео проходит один и тот же путь, даже если часть этапов вам не видна. Камера захватывает свет в пиксели. Программа предобрабатывает их – меняет размер, шумоподавляет, конвертирует цвет. Кодер сжимает результат в небольшой битстрим. Упаковщик перекодирует его в несколько вариантов адаптивной лестницы. Сеть доставляет выбранный вариант. Устройство декодирует его обратно в пиксели. Экран отображает их. Глаз зрителя – финальный судья.

Каждый этап существует не просто так, и большинство из них меняют немного качества на что-то другое: меньший файл, меньший битрейт, поток, который переживёт слабое соединение. Задача измерения – не делать вид, что обмена нет (он обязан быть), а знать, где происходит каждый обмен, сколько он стоит и потратили ли вы это качество осознанно.

Рис. 1. Карта потери качества. Этапы, окрашенные оранжевым, удаляют информацию; после удаления ни один следующий этап не вернёт её по-настоящему.

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

Этап 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. Поскольку у прямого эфира и пользовательского видео нет мастера для сравнения, для оценки их доставленной картинки нужны метрики без эталона.

Рис. 2. Потери доставки на таймлайне. Full-reference картиночная метрика видит более мягкие пиксели после переключения вниз, но слепа к заминке и задержке старта.

Этап 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, сбросили на низкую ступень лестницы и показали на телефоне, прошёл через пять отдельных вычитаний, каждое усиливает предыдущее. Если нарисовать «оставшееся качество» вдоль цепочки, получится лестница, которая только шагает вниз.

Рис. 3. Потеря однонаправленна. Каждый этап может только удержать качество ровно или шагнуть вниз – но не вверх, – поэтому самая ранняя утечка задаёт потолок для всего, что идёт после.

Что меняет ИИ-апскейл, а что нет

Справедливое возражение: разве ИИ-апскейлеры и сверхразрешение не ломают правило «нельзя вернуть потерянное качество»? Не совсем, и различие – то же разделение верности и восприятия, что и в открывающей статье. Обученная модель может выдать кадр, который выглядит резче и приятнее деградированного входа, придумав правдоподобную деталь – высокое воспринимаемое качество. Но придуманная деталь – уверенная догадка, а не информация, которую выбросил пайплайн, поэтому верность настоящему оригиналу остаётся низкой. Это по-настоящему полезно для просмотра и по-настоящему обманчиво для измерения, и живёт в разделе AI for Video Engineering. Правило держится: оригинальная деталь ушла; модель закрасила пробел.

Где здесь Фора Софт

Фора Софт строит видеопродукты с 2005 года – стриминг, WebRTC-конференции, OTT, онлайн-обучение, телемедицину и видеонаблюдение, – и в каждом жалоба на качество, что ложится на стол, почти никогда не называет настоящий этап. Мы относимся к «видео выглядит плохо» как к вопросу о пайплайне, а не о кодере: проверяем, пришла ли потеря из захвата, даунскейла предобработки, кодирования, лестницы, сети или дисплея, потому что каждому нужен свой ремонт и только один из них – кодек. Дисциплина в том, чтобы измерять более чем на одном этапе – full-reference картиночные метрики там, где есть мастер, QoE-метрики на всей доставке, – чтобы разговор сместился от «выглядит плохо» к «потеряли шесть пунктов VMAF на даунскейле и дважды зависли на 4G», а это уже проблема, которую реально починить.

Главное

  • Качество теряется по всему пайплайну, а не только в кодере.
  • Потеря накопительна и однонаправленна – ни один следующий этап её не вернёт.
  • Предобработка (даунскейл, 4:2:0) наносит тихий ущерб до кодирования.
  • Квантование (ручка QP) – это и есть шаг потери в кодере.
  • Потери доставки – заминки, переключения – невидимы для картиночных метрик.
  • Найдите этап, где утекло, прежде чем крутить кодек.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.