Почему одно и то же видео в mpv и IINA темнее, чем в QuickTime

Откройте один файл на Mac в QuickTime и в плеере на mpv рядом, и в mpv картинка окажется темнее, а тени — тяжелее. Ни один плеер не сломан. Они читают одно и то же видео с двумя разными тональными кривыми — мы измерили обе, и вот в чём разница, на чьей стороне стандарт и как получить другой вариант.

Обновлено

Откройте один и тот же фильм на Mac в QuickTime и в IINA, mpv или Frame Player, и плееры на mpv покажут его темнее: лица в полутёмной комнате теряют объём, ночная сцена превращается в чёрное поле с огоньками. Обычно это объясняют тем, что mpv «давит тени» или что в файле нет информации о цвете и mpv угадывает неправильно. Мы это измерили, и ни то ни другое не совсем верно.

В чём на самом деле разница

Для теста взяли один кадр видео H.264 с шестнадцатью серыми полосами известной яркости, воспроизвели его в QuickTime и во Frame Player на одном и том же дисплее MacBook Pro, захватили оба окна и прочитали попиксельно. Числа — то, что каждый плеер отправил на экран, из 255:

Яркость в файле (16 — чёрный, 235 — белый)QuickTimeКривая mpvРазница
203,74,3+0,6
2811,013,6+2,6
4029,727,6−2,1
6463,355,5−7,8
96102,391,6−10,7
128 (средне-серый)140,0128,7−11,3
160176,7167,1−9,6
224242,7240,6−2,1

Бросаются в глаза две вещи. Самые тёмные ступени в mpv вовсе не темнее — они на уровень-другой светлее. Темнее mpv рисует нижние полутона, причём до 12 уровней. Именно там живёт бо́льшая часть полутёмной сцены, поэтому это и воспринимается как потеря деталей в тенях.

На настоящих кадрах разрыв той же формы: на ярком кадре из мультфильма средняя яркость всей картинки в QuickTime — 177,5, а с кривой mpv — 170,9, а пикселей в тенях самого файла — 54,6 против 47,9, примерно на восьмую часть темнее.

Сами цвета одинаковые. Чистый красный вышел как 232, 51, 35 в QuickTime и 231, 50, 34 во Frame Player. Это тональная кривая, а не сдвиг цвета.

Почему: два способа прочитать BT.709

Почти всё SDR-видео — фильмы, сериалы, YouTube — это BT.709. Стандарт говорит, как картинка кодируется; как экран должен превратить её обратно в свет — отдельный стандарт, BT.1886, и он описывает кривую около 2,4 для затемнённой комнаты, той, в которой работает колорист.

  • mpv передаёт экрану значения видео без изменений. Дисплей Mac затем читает их своей кривой, близкой к 2,2, — чуть светлее, чем эталонные 2,4, но из того же семейства.
  • QuickTime декодирует BT.709 кривой около 1,96, а затем кодирует результат для дисплея. На средне-сером это 140 вместо 129. Это давний выбор Apple, который видеомонтажёры обсуждают как «QuickTime gamma shift», и он хорошо сходится с нашими измерениями: модель предсказывает 63,6 на полосе 64 и 141 на средне-сером; QuickTime показал 63,3 и 140.

Так что по стандарту ближе более тёмная картинка mpv. А по привычке на Mac знакомее более светлая картинка QuickTime: её показывает системный плеер — и, судя по сообщениям, с которых начался этот тест, другие плееры на видеофреймворке Apple тоже, — и видео, смонтированное и проверенное на Mac, часто утверждали именно в таком виде. Ошибки нет ни в одном, и ни один не прав всегда.

«В файле нет информации о цвете»

Многие такие жалобы касаются MKV-файлов, в которых ffprobe не показывает ни color_space, ни color_range, поэтому естественно заподозрить, что плеер плохо угадывает. Мы убрали из тестового видео все цветовые метки, а потом сделали копию, правильно помеченную как BT.709. Оба плеера нарисовали помеченную и непомеченную копии одинаково, полоса в полосу. Для HD-видео без меток mpv предполагает BT.709, и QuickTime тоже; дальше каждый рисует BT.709 по-своему. Метки в ваших файлах не изменят картинку ни в одном из них.

Что измеряет тест на цветных полосах

Ещё один способ сравнивать эти плееры — цветные полосы SMPTE: сгенерировать их в BT.709, считать каждую полосу с экрана «Цифровым колориметром» в режиме «Display in sRGB» и усреднить, насколько она отклоняется от «теоретического» значения. Мы провели и этот тест, и оказалось, что прежде чем измерить цвет, он измеряет две другие вещи.

Во-первых, диапазон. Полосы хранятся как видео ограниченного диапазона, где чёрный — это код 16, а полоса 75 % — 180. Плеер должен растянуть это до 0–255 экрана: (180 − 16) × 255 / 219 = 191, а 16 становится 0. Если «теоретическими» значениями взять 180 и 16 — числа из файла, — то каждый плеер, правильно декодирующий файл, теряет по 11 уровней в каждом полном канале и по 16 в каждом пустом, а тот, что растяжение пропускает, выглядит почти идеальным. Мы проверили это на двух файлах, одинаковых в каждом пикселе, один с меткой ограниченного диапазона, другой — полного: один и тот же плеер на одних и тех же пикселях получил 12,9 по эталону 180/16, когда декодировал правильно, и 1,9, когда ему велели не растягивать. По правильному эталону 191/0 всё наоборот: 0,5 и 11,4. Рейтинг по эталону 180/16 сортирует плееры по тому, расширяют ли они диапазон.

Во-вторых, кривая. По правильным значениям Frame Player с настройками по умолчанию отклонился в среднем на 0,3 уровня, QuickTime — на 3,3, а наша настройка «Как в системе» — на 3,6, ровно потому, что она совпадает с QuickTime. Это соглашение mpv оценивает само себя: правильно расширенные значения, отправленные на экран без собственной кривой, — это и есть то, что делает mpv. Оценка говорит, какому соглашению следует плеер, а не насколько он точен.

И большую часть разницы тест прячет. Семь из 27 участков — чистый чёрный или полный белый, где все кривые совпадают; большинство остальных — цвета 75 %, у верхнего края кривой; полутонов среди них только два. Между QuickTime и mpv полосы в среднем отличаются на 3,4 уровня, а обычная серая шкала показывает 8,3 в полутонах — больше чем вдвое, и в той части картинки, где на самом деле живёт полутёмная сцена. Если хотите увидеть эту разницу, смотрите на серые, а не на цветные полосы.

Рецепт, который ходит по форумам, и почему у нас он не сработал

Исправление, которое обычно советуют для IINA, — три настройки mpv:

gamma-factor=1.1218765935747068
vf=format=gamma=gamma2.2
icc-profile-auto=yes

Главные здесь первые две: они велят mpv считать видео обычной кривой 2,2, а затем изгибают её на 2,2 / 1,961 — те самые 1,96 Apple. Во Frame Player тональная кривая с ними вышла правильной. Но третья, ICC-профиль дисплея, сделала все цвета бледнее: чистый красный ушёл с 232, 51, 35 на 213, 68, 49, зелёный — с 117, 251, 76 на 152, 244, 103. Цветом картинки управляли дважды: один раз mpv под дисплей и ещё раз macOS, которая и так сама переводит видеослой Frame Player под экран.

Без строки ICC одна только кривая слишком высветлила самые глубокие тени (полоса 28 на 18,7 вместо 11,0 у QuickTime), потому что mpv тогда кодирует под чистый дисплей 2,2, а у кривой дисплея Mac возле чёрного есть прямой участок. В итоге совпадение дала четвёртая настройка, которая заставляет mpv использовать эту настоящую кривую:

target-trc=srgb
treat-srgb-as-power22=no

Вместе с фильтром формата и гамма-коэффициентом это воспроизвело QuickTime с точностью до половины уровня начиная с полосы 32 и до двух единиц на каждом цвете.

Как с этим обходится Frame Player

По умолчанию Frame Player оставляет кривую mpv, а кривую QuickTime предлагает на выбор: Параметры › Видео › Цвет SDR-видео › Как в системе.

  • Это та самая комбинация, измеренная выше, без ICC, поэтому цвета остаются ровно такими же, а меняется только тональная кривая.
  • Картинка меняется сразу, даже на кадре на паузе, — переключайте туда и обратно, чтобы понять, что вам больше нравится.
  • Затрагивается только SDR-видео. HDR-файлы сохраняют собственный тонмаппинг, а изображения остаются как есть. Когда за SDR-файлом идёт HDR-файл, настройки возвращаются раньше, чем нарисован его первый кадр.
  • Ваш mpv.conf главнее. Если вы сами задали там gamma-factor или target-trc, переключатель эту строку не трогает.
  • Снимки кадра следуют выбору, поэтому экспортированный кадр выглядит так, как его показывал плеер.

Переключатель есть только на macOS: вопрос, на который он отвечает, — «mpv или Apple», а в Windows нет стороны Apple, под которую подстраиваться.

Вопросы

mpv показывает видео неправильно?

Нет. В сравнении с QuickTime на том же дисплее mpv темнее в нижних полутонах — до 12 уровней из 255, — а цвета те же. Это другая тональная кривая, а не ошибка, и именно она ближе к вещательному стандарту, который рассчитан на затемнённую комнату. QuickTime рисует то же видео светлее намеренно.

Дело в том, что в файле нет информации о цвете?

Ни в QuickTime, ни во Frame Player — копия того же файла с меткой BT.709 дала в обоих в точности те же числа, что и копия без метки. IINA от открытия к открытию показывала один из двух вариантов, и связать это с меткой нам не удалось.

Какой из вариантов правильный?

По стандарту ближе тёмный. По тому, с чем сравнивают на Mac, — светлый: кривая QuickTime — это то, что показывает системный плеер, и видео, смонтированное и проверенное на Mac, часто утверждали именно в таком виде. Какой выбрать, зависит от того, какой из двух вы ожидаете увидеть.

Тест на цветных полосах говорит, что mpv — самый точный плеер. Это так?

Зависит от эталона. Если эталон — «сырые» числа файла (180 и 16), тест поощряет плеер, который пропускает расширение ограниченного диапазона до полного. Если эталон — правильно расширенные значения (191 и 0), он по самому своему устройству поощряет соглашение mpv — mpv набирает около 0,3 уровня, QuickTime около 3,3. В любом случае тест говорит, каким соглашениям следует плеер, а полутонов, где mpv и QuickTime расходятся сильнее всего, полосы почти не касаются.

Касается ли это HDR-видео?

Нет. В HDR-видео другая передаточная функция, и оно проходит через тонмаппинг; описанная здесь разница касается только SDR.

Бывает ли такое в Windows?

Там этот вопрос по сути не встаёт. Разница — между mpv и собственным видеофреймворком Apple, а в Windows нет системного плеера, с кривой которого все сравнивают.

Откройте что-нибудь.Плеер запомнит, где вы остановились.

$ brew install --cask risenxxx/tap/frame-player

Версия 1.38.1macOS-сборки нотаризованыWindows-сборки без подписи: SmartScreen спросит один раз