Что такое джаддер? Артефакты частоты кадров

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

TL;DR

Джаддер (judder) – это неровное, дёрганое движение, возникающее, когда кадры держатся на экране разное время; чаще всего это происходит, когда плёнка 24 кадра в секунду попадает на экран 60 Гц через кадаенс 3:2 pulldown, и кадры удерживаются попеременно то 50, то 33 миллисекунды. Стуттер (stutter) – родственный «спотык», который видно, когда кадр потерян или повторён из-за того, что конвейер или плеер не успел его доставить вовремя, и движение лурчит или на миг замирает. Ловушка для любого, кто измеряет качество, в том, что это ошибки времени, а не пикселей: каждый отдельный кадр может быть идеальным, поэтому покадровая метрика – PSNR, SSIM и даже VMAF, чья единственная временная feature измеряет, насколько движется контент, а не сломан ли кадаенс, – покажет отличное качество на клипе, который заметно дёргается. Чтобы поймать временные артефакты, нужна метрика, осознающая частоту кадров (FRQM, ST-GREED или оконные feature частоты кадров в ITU-T P.1204), детекция кадаенса и дропов на стороне плеера или – истина в последней инстанции – человек, смотрящий на движение.

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

Джаддер и стуттер – это артефакты, которые стоп-кадр никогда не покажет, а покадровая оценка качества с радостью пропустит. Можно отгрузить клип с безупречным средним VMAF и панорамой, которая дёргается достаточно сильно, чтобы породить тикеты в поддержку, потому что число никогда не смотрело, когда кадры показаны, – только на то, что в них. Эта статья – для видеоинженера, стриминг-лида или QA-инженера, который видел, как рендер дёргается на панораме или как хитчит видеозвонок, и хочет точно знать, что происходит во временном измерении, почему его объективная метрика промолчала и какие инструменты это реально измеряют. Сделаете это правильно – и перестанете доверять одному числу качества картинки сертификацию движения, которое оно не было создано видеть.

Как выглядят джаддер и стуттер

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

Джаддер – это неровное движение от того, что кадры показываются разное время. Представьте камеру, плавно панорамирующую вдоль линии горизонта. Если каждый кадр держится на экране одинаковое число миллисекунд, движение выглядит плавным. Если одни кадры задерживаются, а другие мелькают, та же панорама обретает повторяющийся «спотык-шаг» – едва уловимый «рывок» в движении, повторяющийся несколько раз в секунду. Контент движется с постоянной скоростью; время показа – нет, и ваш глаз, плавно отслеживающий движение, видит рассогласование как дёрганье.

Стуттер – это родственный «спотык», когда кадр пропал или повторён. Там, где джаддер – это регулярная, повторяющаяся неровность, встроенная в кадаенс, стуттер – это нерегулярный лурч: кадр, который плеер должен был показать вовремя, приходит поздно, дропается или держится лишний такт, и движение прыгает или ненадолго замирает. Частый признак – объект, который будто медлит или даже кажется отскочившим назад на один такт, прежде чем нагнать.

Третий член семейства бежит в обратную сторону. Эффект мыльной оперы (soap-opera effect) – это неестественно гладкое, «видеошное» движение, которое телевизор создаёт, когда выдумывает лишние кадры интерполяцией движения, чтобы заполнить высокочастотную панель. Это не потеря кадров, а синтез фальшивых, и он несёт свои артефакты – к нему вернёмся ниже. Все три объединяет одно свойство, определяющее эту статью: они про время и число кадров, а не про пиксели внутри любого из них.

Рисунок 1. Что такое джаддер. Та же панорама, снятая с постоянной частотой 24 кадра в секунду, показана на экране 60 Гц. Поскольку 60 не делится нацело на 24, кадаенс 3:2 удерживает один кадр три обновления (50 мс), а следующий – два (33 мс). Равное движение, неравное время показа – глаз читает разницу как джаддер.

Откуда берётся джаддер: преобразование частоты кадров

Джаддер – почти всегда отпечаток преобразования частоты кадров, которое не делится нацело. Классический случай – показ кино 24 кадра в секунду на экране 60 Гц.

Начнём с арифметики, потому что в ней вся суть. Экран 60 Гц обновляется 60 раз в секунду, раз в 1000 ÷ 60 ≈ 16,67 миллисекунды. Кино идёт 24 кадра в секунду. Чтобы показать 24 кадра за 60 обновлений, каждому кадру нужно было бы занять 60 ÷ 24 = 2,5 обновления – а показать кадр за половину обновления нельзя. Поэтому система округляет попеременно, паттерном 3:2 pulldown (или 2:3 pulldown): держим первый кадр 3 обновления, следующий – 2, следующий – 3, следующий – 2 и так далее. Три обновления – это 3 × 16,67 = 50 миллисекунд; два обновления – 2 × 16,67 = 33,3 миллисекунды. На каждой паре кадров движение показано чуть медленно, потом чуть быстро – и эта неровность 50-против-33, повторяющаяся около двенадцати раз в секунду, и есть джаддер.

Название идёт от исходного аналогового процесса. Преобразуя кино 24 fps в 29,97 fps телевидения NTSC, телесин сначала замедляет плёнку на одну тысячную до 23,976 fps (незаметно – двухчасовой фильм идёт примерно на 7 секунд дольше), затем распределяет каждые четыре киноплёночных кадра по пяти чересстрочным видеокадрам, десяти полям, в полевом кадаенсе 3-2-3-2 (Poynton, Digital Video and HDTV, 2003). Четыре кадра на входе, пять на выходе. Неровный кадаенс был приемлем на ламповом ТВ и преследует каждое преобразование 24-в-60 с тех пор.

Есть и более «чистое» на вид преобразование, которое меняет джаддер на другую ошибку. В регионах PAL кино 24 fps часто показывают на 25 fps, просто прокручивая на 4% быстрее (25 ÷ 24 = 1,0417) с кадаенсом 2:2, кадр в кадр. Движение ровное – джаддера нет, – но весь фильм идёт на 4% короче, а высота звука поднимается примерно на 0,68 полутона, тот самый известный «PAL speedup». Это тот же урок наоборот: когда частоты кадров источника и экрана не делят чистое отношение, чем-то приходится жертвовать – ровным кадаенсом, верным хронометражем или верной высотой звука. Выбираете вы.

Рисунок 2. Кадаенс 3:2 pulldown. Четыре кадра 24 fps (A, B, C, D) показаны за десять обновлений экрана 60 Гц: A держится 3 обновления, B – 2, C – 3, D – 2. Повторяющийся паттерн 3-2 и заставляет равноскоростное движение приходить к глазу неровно. (Классический телесин NTSC упаковывает тот же кадаенс в пять чересстрочных видеокадров, десять полей.)

Откуда берётся стуттер: дропнутые и опоздавшие кадры

Джаддер – это заложенная неровность от отношения частот кадров. Стуттер – незапланированная неровность от кадра, который не пришёл вовремя.

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

Здесь стоит провести чёткую границу, потому что эти два путают. Стуттер – это не ребуферинг. Ребуферинг – это когда буфер плеера пустеет и воспроизведение встаёт: спиннер, полная остановка, потому что данные не пришли. Стуттер может случиться при полном буфере и идеальной сети: все кадры на месте, но один отрендерен поздно или дропнут, и движение хитчит, ни разу не остановившись. Это разные измерения зрительского опыта, измеряются раздельно, и доставочная сторона этой истории – сталлы, время старта, буфер – относится к QoE стриминга. Здесь нас заботит движение картинки, а не труба, что её кормила.

Эффект мыльной оперы: та же ручка, повёрнутая в другую сторону

Если джаддер и стуттер – это слишком мало кадров, показанных неровно, то эффект мыльной оперы – это слишком много кадров, выдуманных. Чтобы прокормить панель 120 Гц от источника 24 fps, feature интерполяции движения в телевизоре оценивает, как объекты движутся между двумя реальными кадрами, и синтезирует промежуточные кадры, чтобы заполнить разрыв. Сделано хорошо – движение выглядит немыслимо гладким; сделано вообще – оно сдирает кадаенс 24 fps, который зритель столетие ассоциирует с «кинематографичным», и поэтому многим кажется дневной мыльной оперой.

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

Здесь же 24 fps «лук» и оправдывает себя, и в дело вступает motion blur. Кино, снятое с углом затвора 180 градусов, экспонирует каждый кадр половину кадрового интервала – 1/48 секунды на 24 fps, – так что быстрое движение записывается как размытие, мостящее разрыв между положением одного кадра и следующего. Это размытие и делает 24 fps смотрибельными: оно сглаживает прыжки. Снимите те же 24 fps с очень быстрым затвором и чёткими, без размытия кадрами – и быстрая панорама сильно задёргается, потому что нечем заполнить разрывы между большими скачками положения. Механика частоты кадров, затвора и motion blur со стороны причины живёт в секции Video Encoding; здесь важно лишь, что намеренный кадаенс 24 fps – это творческий выбор, который метрика не должна «исправлять», и что motion blur и джаддер торгуются друг с другом.

Почему покадровая метрика слепа ко всему этому

Вот измерительное сердце статьи и причина, по которой временным артефактам нужна отдельная статья. Объективные метрики, на которые опирается большинство команд, – это покадровые метрики: они оценивают каждый кадр по отдельности, а потом усредняют оценки. Джаддер и стуттер – это ошибки во времени, а не в каком-либо одном кадре, поэтому такие метрики структурно к ним слепы.

Пройдём почему. Число, что сравнивает сжатый кадр с оригиналом попиксельно, называемое PSNR (пиковое отношение сигнал/шум, в децибелах), берёт два кадра и возвращает одно значение. Структурная метрика SSIM (структурное сходство, 0–1) делает то же. Обе определены на одной паре изображений; ни у одной нет понятия о том, как долго кадр был на экране и не был ли один дропнут. Прогоните через них джаддер от 3:2 pulldown – и пиксели каждого кадра всё ещё ровно те, что нужно (джаддер – в тайминге показа, который метрика никогда не получает), поэтому они покажут идеальное качество.

VMAF – слитная перцептивная метрика Netflix (Video Multimethod Assessment Fusion, 0–100) – это та, которой здесь вероятнее всего доверятся, и у неё есть временная feature, поэтому стоит быть точным в том, что эта feature делает. VMAF сплавляет три базовые feature: VIF и ADM (обе пространственные, про деталь и структуру) и одну временную feature под названием Motion2. Собственная документация Netflix описывает Motion2 прямо: «простая мера временной разницы между соседними кадрами… средняя абсолютная попиксельная разница по компоненте яркости». Прочитайте внимательно. Она измеряет, насколько движется контент – высоко для быстрой панорамы, низко для статичного плана, – а не показано ли движение ровно. Это дескриптор движения сцены, а не детектор временного искажения. У дёргающейся панорамы и плавной панорамы с тем же контентом почти одинаковый Motion2.

Это та же величина, которую ITU-T P.910, стандарт субъективных видеометодов, называет Temporal Information (TI) – стандартное отклонение по кадру попиксельной разницы между соседними кадрами, «мера, указывающая число временных изменений видеопоследовательности… выше для высокодвижущихся последовательностей» (ITU-T P.910, 2023). TI и Motion2 – родственники, и оба характеризуют контент, а не искажение. Нет широко применяемой покадровой метрики, чей временной член растёт именно потому, что сломался кадаенс.

Есть и вторая, тихая причина, по которой даже стуттер, который всё-таки регистрируется, теряется: пулинг. Дропнутый кадр создаёт реальную попиксельную ошибку в горстке кадров вокруг себя – но эта ошибка потом усредняется по сотням верных кадров, и среднее почти не двигается. Клип 10 секунд на 60 fps – это 600 кадров; один уродливый «спотык» – доля процента от среднего. Шаг пулинга, превращающий покадровые оценки в одно число, разбавляет ровно тот момент, на который зритель бы пожаловался. Это тот же урок, что проходит сквозь то, где врут объективные метрики: одно среднее число – это сводка, а временные артефакты – ровно тот локальный, привязанный ко времени случай, который сводка стирает.

«Частая ошибка: сертифицировать движение покадровым средним. Дорогая ошибка – прогнать панорамный или высокодвижущийся клип через PSNR или VMAF, увидеть высокое среднее и подписать движение. Оценка валидировала пиксели каждого кадра, а не кадаенс, в котором они показаны. Клип может читаться как средний VMAF 96 и заметно дёргаться на каждой панораме. Если частота кадров, преобразование частоты кадров или плавность воспроизведения в области интереса, не позволяйте покадровой метрике говорить за них: используйте метрику, осознающую частоту кадров, осмотрите кадаенс и – для всего, что отгружается, – смотрите на движение. И никогда не сравнивайте два клипа с разной частотой кадров покадровой метрикой, будто числа на одной шкале; это не так.»

Как реально измерить временное качество

Если повседневные метрики слепы ко времени, что же его видит? Четыре честных варианта, грубо в порядке строгости.

Объективные метрики, осознающие частоту кадров. Небольшое семейство метрик создано специально, чтобы оценивать качество при изменении частоты кадров. FRQM, Frame Rate dependent Quality Metric (Zhang, Mackin, Bull, ICIP 2017), применяет временное вейвлет-разложение, чтобы сравнить низкочастотный по кадрам клип с его высокочастотным референсом, предсказывая перцептивную цену снижения частоты кадров; валидирована на базе BVI-HFR вплоть до 120 fps. ST-GREED, Space-Time Generalized Entropic Difference (Madhusudana и др., IEEE TIP, 2021), моделирует статистику пространственных и временных полосовых коэффициентов и сравнивает их энтропию между референсом и искажённым видео, улавливая изменения качества, возникающие именно из-за разницы частоты кадров, и достигает state-of-the-art на базе LIVE-YT-HFR. Им нужен референс, но, в отличие от PSNR/SSIM/VMAF, они созданы реагировать на временное измерение.

Стандартизованные стриминговые модели. Для адаптивного стриминга ITU-T P.1204 – серия моделей качества видео стриминга вплоть до 4K – явно работает с частотой кадров. Её набор feature включает оконные меры частоты кадров и индикаторы повторённых кадров, а модели обучены на частотах от 15 до 60 fps (ITU-T P.1204, 2023). Когда цепочка доставки меняет частоту кадров, модель класса P.1204 создана это учесть там, где метрика только-по-картинке – нет.

Безреференсная детекция кадаенса и дропов. На лайве, пользовательском или уже доставленном контенте нет нетронутого референса, поэтому таймлайн измеряют напрямую: детектируют кадаенс 3:2 (или 2:2) по паттерну повторённых кадров, помечают дублированные и дропнутые кадры и измеряют межкадровый интервал, чтобы найти, где тайминг показа стал неровным. Это дёшево, работает без референса и говорит, что кадаенс нерегулярен, – хотя, как и любая слепая мера в этой галерее, не отличит намеренный кадаенс от ошибки.

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

Метрика / методЧто измеряетНужен референсГде врёт на джаддере и стуттере
PSNRСредняя попиксельная ошибка на кадр (дБ)ПолнореференснаяСлепа к таймингу – под джаддером pulldown кадры пиксельно верны, ошибки нет
SSIMСтруктурное сходство на кадр (0–1)ПолнореференснаяТа же слепота; покадровая по построению, временного члена нет
VMAF (Motion2)Слитная перцептивная оценка (0–100)ПолнореференснаяЕдинственная временная feature измеряет движение контента, не кадаенс; пулинг ещё и разбавляет стуттер
FRQM / ST-GREEDКачество, зависящее от частоты кадровПолнореференснаяСозданы под смену частоты кадров; нужен высокочастотный референс и лабораторная валидация
ITU-T P.1204Стриминговый MOS с учётом частоты кадровBitstream/гибридМоделирует оконную частоту кадров и повторы; ограничена обученными кодеками и 15–60 fps
Безреференсный чек кадаенса/дроповПаттерн pulldown, дропы/повторыБезреференснаяПомечает неровный тайминг на лайве/UGC; не отличит намеренный кадаенс от ошибки

Таблица 1. Шесть способов трактовать временные артефакты. Повседневные покадровые метрики (PSNR, SSIM, VMAF) слепы к таймингу показа, потому что джаддер оставляет пиксели каждого кадра верными. Метрики, что видят частоту кадров (FRQM, ST-GREED, P.1204), созданы под неё; безреференсный чек кадаенса работает без референса, но не читает замысел.

Рисунок 3. Временное слепое пятно. Покадровая метрика оценивает пиксели каждого кадра против референса. Под джаддером pulldown пиксели ровно те, что нужно, поэтому PSNR/SSIM/VMAF читаются как «отлично»; feature Motion2 у VMAF лишь измеряет, насколько движется контент. Ошибка – неровный тайминг показа – в измерении, которое эти метрики никогда не получают.
Рисунок 4. Семейство временных артефактов. Джаддер – слишком мало кадров, удержанных неровно отношением частот; стуттер – кадр, дропнутый или задержанный в конвейере; эффект мыльной оперы – лишние кадры, выдуманные интерполяцией. Все три – ошибки тайминга и числа кадров, измерения, которое покадровые метрики не моделируют.

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

Фора Софт делает видеософт с 2005 года – стриминг, WebRTC-конференции, e-learning, OTT, телемедицина и видеонаблюдение, – и плавность движения – то измерение качества, что сильнее всего меняется по продукту. WebRTC-звонок, который стуттерит под джиттером сети, ломается иначе, чем OTT-тайтл, который дёргается, потому что мастер 24 fps встретил конвейер 60 Гц; поток видеонаблюдения, что тихо дропает кадры, может потерять ту самую секунду, что имела значение. Мы относимся к временному качеству как к собственной задаче измерения, отдельной от качества картинки: покадровые метрики сертифицируют кадры, но чеки кадаенса, счёт дропнутых кадров и тайминг межкадрового интервала сертифицируют движение, а на стороне доставки мы держим стуттер (ошибку рендера) отдельно от ребуферинга (пустого буфера). Исправления следуют за причиной – чистое отношение частот кадров от начала до конца, запас, при котором плеер не пропускает дедлайн, и сдержанность в желании «сгладить» движение, которое автор снял на 24 fps намеренно.

Ключевые выводы

  • Джаддер – неровное движение от кадров, удержанных разное время; стуттер – «спотык» от дропнутых или опоздавших кадров.
  • Классическая причина – 3:2 pulldown: 24 fps на 60 Гц держит кадры 50 мс, потом 33 мс, повторяя.
  • Покадровые метрики (PSNR, SSIM, VMAF) слепы к таймингу – джаддер оставляет каждый кадр пиксельно верным.
  • Единственная временная feature VMAF измеряет, насколько движется контент, а не сломан ли кадаенс.
  • Пулинг ещё и прячет стуттер, усредняя его по сотням верных кадров.
  • Чтобы видеть время, нужна метрика частоты кадров (FRQM, ST-GREED, ITU-T P.1204), детекция кадаенса или зритель.

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

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

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