Содержание статьи +
- Кратко
- Зачем это нужно
- От одного числа к картинке
- Покадровый график: качество во времени («когда»)
- Пространственная теплокарта: где сломалось качество («где»)
- Кривая «битрейт-качество»: сколько качества за бит («сколько»)
- От кривых к решениям: convex hull и BD-rate
- Как построить графики: от вывода метрики к картинке
- Где здесь Фора Софт
- Ключевые выводы
- Что почитать дальше
Кратко
Одна оценка качества – это сводка, а сводка прячет всё, что делает энкод интересным; визуализация измерения – это способ увидеть то, что число усреднило. Почти всю работу делают три картинки: покадровый график, который показывает, когда качество упало по таймлайну; пространственная теплокарта, которая показывает, где внутри кадра оно сломалось; и кривая «битрейт-качество», которая показывает, сколько качества вы покупаете за каждый дополнительный бит. Из кривой «битрейт-качество» вырастают два инструмента решений, на которые опирается этот раздел, – convex hull (выпуклая оболочка), выбирающий лучшее разрешение для каждого битрейта, и Bjontegaard Delta rate (BD-rate), сообщающий экономию битрейта при равном качестве. Эта статья показывает, как читать каждую картинку честно, как построить её из покадрового вывода, который FFmpeg и libvmaf уже выдают, и какие приёмы рисования тихо врут.
Зачем это нужно
Каждая метрика этого раздела – число, что сравнивает сжатый кадр с оригиналом попиксельно (PSNR), оценка структурного сходства (SSIM) и обученная перцептивная оценка (VMAF) – схлопывает тысячи кадров в одну цифру. Эта цифра – то, что проверяет гейт качества и сообщает бенчмарк, но это не то, что отлаживает инженер. Статья – для руководителя кодирования, QA-инженера и технического продакт-оунера, у которого есть папка с выводом метрики и которому нужно превратить её в картинку, по которой можно действовать: найти две секунды, что регрессировали, ткнуть в область кадра, которая развалилась, и считать, сколько бит стоит следующий шаг качества. Сделаете визуализацию правильно – причина проблемы качества обычно очевидна с одного взгляда. Сделаете неправильно – усечённая ось, линейная шкала битрейта, теплокарта только в цвете – и график вводит в заблуждение увереннее, чем отсутствие графика.
От одного числа к картинке
Оценка качества отвечает на вопрос «насколько хорошо в целом?». Визуализация отвечает на три вопроса, которые на самом деле ведут к починке: когда, где и сколько. У каждого – своя картинка, и они не взаимозаменяемы.
Покадровый график кладёт время на горизонтальную ось, а оценку – на вертикальную, так что вы видите форму качества по всему клипу: провалы, восстановление, один плохой план. Пространственная теплокарта выбрасывает время и вместо этого раскрашивает один кадр по локальному качеству, так что вы видите, какая часть картинки подвела, пока остальное держалось. Кривая «битрейт-качество» выбрасывает и время, и пространство и строит одну сводную оценку против битрейта, который её породил, так что вы видите компромисс, который делает каждое решение о кодировании. Хорошее расследование качества обычно проходит все три по порядку: покадровый график говорит, какой кадр инспектировать, теплокарта – где в этом кадре смотреть, а кривая «битрейт-качество» – помогли бы вообще лишние биты.
| Вид | На какой вопрос отвечает | Оси / форма | Из чего построен | Что может скрыть |
|---|---|---|---|---|
| Покадровый график | Когда упало качество? | Оценка (y) против индекса кадра (x) | Покадровые оценки | Где внутри кадра повреждение |
| Пространственная теплокарта | Где в кадре сломалось? | Цвет поверх одного кадра | Локальная карта метрики (окна SSIM) | Когда во времени был провал |
| Кривая «битрейт-качество» | Сколько качества за бит? | Качество (y) против битрейта (лог. x) | Одна сводная оценка на энкод | Все покадровые и порегионные детали |
Таблица 1. Три вида и что каждый прячет. Каждая картинка – намеренная проекция, выбрасывающая одну ось – время, пространство или обе, – так что чтение лишь одной оставляет слепое пятно, которое закрывают другие.
Пара слов о том, из чего сделаны эти картинки. Каждая полнореферентная метрика – та, которой нужен нетронутый оригинал для сравнения, – выдаёт оценку для каждого кадра до того, как что-либо усредняется. Этот покадровый поток – сырьё для первых двух картинок; кривая «битрейт-качество» строится из одной сводной оценки на энкод по нескольким энкодам. Так что перед любой визуализацией вам нужны покадровые числа, и инструмент, который у вас почти наверняка уже есть, их выдаёт.
Покадровый график: качество во времени («когда»)
Покадровый график – самая полезная и самая запущенная картинка в видеокачестве. Время (или индекс кадра) идёт по оси x; оценка – вверх по оси y. Ровная линия у потолка – чистый энкод. Линия, что ныряет на участке и восстанавливается, – это клип, регрессировавший ровно на этих кадрах, почти всегда трудный для кодирования план, который энкодер не смог позволить себе на выбранном битрейте.
Вот почему график важнее среднего, которое он суммирует. Возьмём клип из 300 кадров и два энкода с одинаковым арифметическим средним VMAF 94,8. Энкод B держит ровные 94,8 по всему клипу. Энкод A тратит 270 кадров на VMAF 97, а затем обрушивается до VMAF 75 на 30-кадровом экшн-плане. Средние одинаковы, а впечатления – нет: энкод A заметно разваливается на одну секунду, и зритель эту секунду запоминает. Среднее к ней слепо; покадровый график сразу показывает её как 30-кадровый каньон.
Это самый частый способ, которым число качества обманывает, и открытая документация VMAF говорит об этом прямо: усреднение покадровых оценок по последовательности «может скрыть влияние трудных для кодирования кадров», если такие кадры редки (Netflix VMAF FAQ, 2026). Инженеры Twitter намерили тот же эффект на масштабе – у энкода со средним VMAF 97,7 всё равно была заметная популяция кадров с низким перцентилем, которые стоит чинить первыми (Twitter Engineering, 2020). Картинка – то, что вскрывает разрыв между комфортным средним и кадрами, которые зритель реально замечает.
Две сводки делают график количественным, не выбрасывая худшие кадры. Первая – гармоническое среднее, которое весит низкие оценки сильнее обычного среднего. Для энкода A выше гармоническое среднее – это число кадров, делённое на сумму обратных величин:
HM = n / Σ(1/оценка_i)
= 300 / ( 270 × (1/97) + 30 × (1/75) )
= 300 / ( 2,7835 + 0,4000 )
= 300 / 3,1835
= 94,24Гармоническое среднее 94,24 сидит ниже арифметического 94,8 – небольшой сдвиг, потому что 30 плохих кадров из 300 всё же меньшинство. Вторая сводка грубее и красноречивее: 5-й перцентиль, оценка худших 5% кадров. Для энкода A это 75; для ровного энкода B – около 94. Арифметические средние различаются на ноль, а 5-е перцентили – на девятнадцать пунктов, и эти девятнадцать пунктов – именно то, что видит зритель. Чтение худших кадров вместо среднего – целиком тема статьи пулинг покадровых оценок в одно число; график – её визуальный спутник.
Чтобы получить данные за этим графиком, новый инструмент не нужен. Фильтр libvmaf в FFmpeg пишет покадровый лог, когда вы задаёте log_path и log_fmt, где формат – один из json, csv, xml или sub, по одной строке на кадр (Netflix VMAF, Using VMAF with FFmpeg, 2026). Минимальный вызов выглядит так:
# Покадровый VMAF (+ PSNR и SSIM) в JSON-лог, по одной записи на кадр.
ffmpeg -i distorted.mp4 -i reference.mp4 \
-lavfi "libvmaf=feature=name=psnr|name=float_ssim:log_fmt=json:log_path=frames.json" \
-f null -Точная команда, правила выравнивания и масштабирования, ловушки выбора модели – тема статьи измерение качества с FFmpeg и libvmaf; общая механика FFmpeg живёт в шпаргалке по FFmpeg раздела Video Encoding. Здесь важно лишь то, что покадровый JSON, нужный графику, выпадает из измерения, которое вы и так запускаете.
Пространственная теплокарта: где сломалось качество («где»)
Покадровый график говорит, какой кадр регрессировал. Он ничего не говорит о том, где в этом кадре повреждение. Для этого нужна вторая картинка: пространственная теплокарта, которая раскрашивает один кадр по локальному качеству, так что блочное небо читается как горячее пятно, пока чистое лицо остаётся холодным.
Теплокарта возможна потому, что некоторые метрики считаются локально до того, как их сведут в оценку кадра. SSIM, метрика структурного сходства, – самый ясный случай: она вычисляется по малым перекрывающимся окнам по всему кадру и лишь затем усредняется, так что промежуточные пооконные значения образуют карту качества, которую можно отрисовать напрямую (Wang, Bovik, Sheikh & Simoncelli, IEEE Transactions on Image Processing, 2004). Отрисуйте эту карту цветом поверх кадра – и метрика перестаёт быть числом и становится диагнозом: низко оценённое пятно сидит ровно на области, что сломалась.
Чтение карты – навык, который стоит назвать. Тёмное, низко оценённое пятно в детализированной области обычно означает агрессивное размытие или шум сжатия – энкодеру не хватило бит на текстуру. Низко оценённая полоса вдоль верхнего и нижнего краёв часто вообще не проблема качества, а рассогласованное сравнение: леттербокс или несовпадение пропорций между эталоном и искажённым, из-за чего метрика сравнивает чёрные полосы с картинкой. Это различие важно, потому что один вывод отправляет вас к энкодеру, а другой – к вашей измерительной обвязке. Специализированные инструменты показывают эти карты – Video Quality Measurement Tool (VQMT) рисует попиксельные карты метрик, а исследовательские предикторы вроде ColorVideoVDP накладывают попиксельную теплокарту искажений на кадр (проект VQMT; Mantiuk и др., 2024). Где эти инструменты стоят относительно FFmpeg – тема статьи VQMT и другие специализированные инструменты качества.
Когда теплокарта локализовала повреждение, следующий шаг – назвать артефакт, и этот словарь – блочность на сетке преобразования, бандинг в градиентах, звон вокруг краёв – живёт в справочнике по артефактам сжатия. Теплокарта указывает; галерея артефактов называет. Одно твёрдое правило для самой картинки: цвет никогда не должен быть единственным носителем смысла. Соедините шкалу с числами, подпишите худшую область и выберите шкалу, которая переживёт чёрно-белую печать, потому что читатель, не различающий ваш красный и зелёный, не получит от карты только в цвете ничего.
Кривая «битрейт-качество»: сколько качества за бит («сколько»)
Третья картинка отступает от одного энкода и задаёт вопрос, на котором держится каждое решение о кодировании: сколько качества для этого контента покупает каждый дополнительный бит? Кривая «битрейт-качество» – перцептивный кузен классической кривой «скорость-искажение» (rate-distortion) – отвечает на него. Битрейт идёт по оси x, почти всегда в логарифмическом масштабе; оценка качества (VMAF 0–100 или SSIM 0–1) идёт вверх по оси y. Каждая точка – один энкод того же контента на другом битрейте, и точки трассируют кривую.
Форма – вот урок. Кривые «битрейт-качество» выпуклые и выполаживаются по мере подъёма: небольшое увеличение битрейта внизу диапазона покупает большой скачок качества, тогда как то же увеличение наверху покупает почти ничего (свойство убывающей отдачи rate-distortion, прочно установленное в литературе по кодированию). Пройдём по конкретной кривой. Переход с 1,0 на 2,0 Мбит/с может поднять VMAF с 80 до 92 – двенадцать пунктов за один мегабит. Переход с 4,0 на 5,0 Мбит/с на том же контенте может поднять VMAF с 97 до 98 – один пункт за тот же мегабит. Те же траты, в двенадцать раз больше отдачи внизу. Колено кривой, где она сгибается из крутого в пологий, – это место, где сидит разумная рабочая точка: достаточно высоко, чтобы качество было хорошим, не так высоко, чтобы платить за пункты, которые ни один зритель не заметит. У этого порога «никто не заметит» есть имя – едва заметная разница (JND, just-noticeable difference), и хорошая лестница битрейтов разносит свои ступени примерно на один JND.
Логарифмическая ось x – не украшение. Битрейт охватывает порядки величин – от 300 кбит/с до 8 Мбит/с в одной лестнице, – и на линейной оси низкобитрейтные ступени, где решается качество, сплющились бы в левое поле, пока высокобитрейтные растянулись бы по странице. Логарифмическая ось разносит ступени равномерно и делает форму кривой читаемой. Всегда подписывайте её как логарифмическую, потому что читатель, предположивший линейную ось, грубо неверно оценит расстояния.
Одна дисциплина правит каждым сравнением «битрейт-качество»: «яблоко к яблоку» или никак. Две кривые можно сравнивать, только если их намерили на том же контенте, в том же разрешении, против того же эталона, той же метрикой, той же моделью и тем же пулингом. Измените что-то одно – и кривые уже не про энкодер, а про вашу непоследовательную обвязку. Это то же ограничение, что правит гейтом качества и бенчмарком, и именно поэтому наша методология бенчмарков штампует каждую опубликованную кривую полным происхождением.
От кривых к решениям: convex hull и BD-rate
Два самых цитируемых инструмента этого раздела – это просто кривые «битрейт-качество», прочитанные особым образом.
Convex hull (выпуклая оболочка) появляется, когда вы строите кривую «битрейт-качество» для каждого разрешения того же контента на одном графике. На низких битрейтах меньшее разрешение выглядит лучше, потому что энкодер может потратить свои немногие биты на меньший кадр; на высоких битрейтах выигрывает большее разрешение. Кривые пересекаются. Верхняя огибающая по всем ним – выпуклая оболочка – это набор точек «разрешение-битрейт», которые никогда не проигрывают, и она – хребет per-title лестницы битрейтов. Полный разбор, включая то, почему каждый энкод меньшего разрешения нужно апскейлить до исходного перед оценкой, – в convex hull и выборе битрейта-разрешения. Картинка там – график «битрейт-качество»; решение – какую точку оставить.
Bjontegaard Delta rate (BD-rate) – это число, которое вы получаете, сравнивая две кривые «битрейт-качество». Предложенное Гисле Бьонтегором в 2001 году, оно сообщает среднюю разницу в битрейте между двумя энкодерами при равном качестве, вычисленную как площадь между их кривыми на общем диапазоне качества (Bjontegaard, VCEG-M33, 2001). Интуиция читается прямо с графика: если при целевом VMAF 93 энкодеру X нужно 3,0 Мбит/с, а энкодеру Y – 2,1 Мбит/с, то Y даёт то же качество за 30% меньше бит в этой точке, и BD-rate усредняет эту экономию по всему диапазону. Отрицательный BD-rate означает, что новый энкодер эффективнее. Что критически важно держать прямо: BD-rate – это экономия битрейта при равном качестве, а не оценка качества. Он не говорит, что один энкодер «выглядит лучше»; он говорит, что один достигает того же качества за меньше бит. Проработанная арифметика на наших собственных числах – в BD-rate на наших цифрах.
Есть и четвёртая картинка, достойная упоминания, потому что качество стриминга – не только про энкод. Таймлайн QoE строит события воспроизведения – время старта, остановки на ребуферинг, переключения битрейта – по часам сессии, превращая качество доставки в нечто столь же читаемое, как покадровый график превращает качество энкода. Эта картинка относится к стороне доставки и разобрана в метриках QoE стриминга; эта статья остаётся с качеством самих пикселей.
Как построить графики: от вывода метрики к картинке
Ни одной из этих картинок не нужен тяжёлый инструментарий. Покадрового JSON или CSV от libvmaf достаточно, чтобы нарисовать первые две, а горстки сводных точек достаточно для третьей. Экосистема предлагает три уровня усилий.
На самом лёгком небольшой скрипт читает покадровый лог и выдаёт график – vmaf-plot делает ровно это для JSON от libvmaf, а рендерер графиков качества, идущий с этой статьёй, делает то же без сторонних зависимостей, выдавая покадровый линейный график, теплокарту-полосу и кривую «битрейт-качество» как чистый SVG. В середине обёртка вроде ffmpeg-quality-metrics гоняет PSNR, SSIM и VMAF за один проход и возвращает аккуратный покадровый JSON и CSV, готовый кормить плоттер (Robitza, ffmpeg-quality-metrics, 2026). На самом тяжёлом графический инструмент делает измерение и рисование вместе: FFMetrics строит интерактивные покадровые графики для PSNR, SSIM, VMAF и XPSNR, позволяет зумить кривую, экспортировать её как SVG или PNG и даже извлекать худшие кадры как картинки для осмотра (FFMetrics, v1.7.0, 2026); VQMT добавляет попиксельные пространственные карты. Где каждый из них стоит в более широком ландшафте – показано в ландшафте инструментов видеокачества.
Что бы ни рисовало картинку, дисциплина та же, что правит числами. Стройте сводки худших кадров рядом со средним, подписывайте оси единицами и масштабом и держите сравнение «яблоко к яблоку». График наследует честность измерения за ним – и, как показывает следующий раздел, может эту честность потерять в нескольких небрежных штрихах.
Частая ошибка: график, который врёт
Быстрейший способ ввести зал в заблуждение – график качества с нечестной осью, и обычно это происходит без умысла. Самый частый нарушитель – усечённая ось y: постройте VMAF от 90 до 100 вместо 0–100, и разница в один пункт раздуется в обрыв, заставив два почти одинаковых энкода выглядеть мирами врозь. Второй – линейная ось битрейта, которая сплющивает низкобитрейтные ступени – ровно там, где решается качество, – в нечитаемую полоску. Третий – сравнение кривых, которые не «яблоко к яблоку»: два энкодера, намеренные на разных разрешениях или с разными моделями VMAF, нарисованные на одном графике так, будто разрыв между ними что-то значит. Четвёртый – теплокарта только в цвете, нечитаемая для дальтоника или в чёрно-белой печати. Пятый – самый тихий: график только со средним, опускающий сводки худших кадров и воспроизводящий на графике ту самую слепоту, которую график должен был вылечить. Каждое лечится одним штрихом – полная ось y, логарифмическая ось битрейта, одно разрешение и модель на сравнение, подписанная шкала плюс форма, и линии перцентилей рядом со средним. Графиком, что следует этим пяти правилам, врать трудно.
Где здесь Фора Софт
Фора Софт с 2005 года строит системы видеостриминга, OTT, видеоконференций, e-learning, видеонаблюдения и телемедицины, и на каждом продукте с собственным конвейером кодирования описанные здесь визуализации – это то, как мы превращаем стену вывода метрик в решение. Мы встраиваем покадровый график и сводки худших кадров в тот же отчёт, что выдаёт гейт качества, так что регрессия всплывает как подписанный провал, на который инженер может кликнуть, а не как число в логе; мы используем пространственные теплокарты, чтобы локализовать артефакт до области, прежде чем проследить его до причины; и мы читаем кривые «битрейт-качество» и их convex hull, чтобы выставить лестницу битрейтов, тратящую биты там, где зритель замечает. Где проекту нужны кривые за конкретным решением «кодек-контент», их дают наши измеренные бенчмарки (см. нашу методологию бенчмарков) с полным происхождением. Цель проста: картинка, что делает правильный выбор очевидным, а неправильный – трудным для защиты.
Ключевые выводы
- Одна оценка – это сводка; покадровый график, пространственная теплокарта и кривая «битрейт-качество» показывают, что она спрятала.
- Покадровый график отвечает на когда: стройте линии перцентиля и гармонического среднего рядом со средним, никогда одно среднее.
- Пространственная теплокарта отвечает на где: отрисуйте локальный SSIM поверх кадра и всегда подписывайте цветовую шкалу.
- Кривая «битрейт-качество» отвечает на сколько: лог. ось битрейта, выпуклая форма, рабочая точка у колена около JND.
- Convex hull выбирает лучшее разрешение на битрейт; BD-rate – это экономия битрейта при равном качестве, а не оценка качества.
- Пять грехов рисования вводят в заблуждение: усечённая ось y, линейная ось битрейта, кривые не «яблоко к яблоку», теплокарты только в цвете, графики только со средним.
Что почитать дальше
- Пулинг: покадровые оценки в одно число – математика за чтением худших кадров.
- Convex hull: битрейт и разрешение – кривая «битрейт-качество» как инструмент проектирования лестницы.
- Измерение качества с FFmpeg и libvmaf – как получить покадровые данные, которые нужны этим графикам.