Почему одно и то же видео в 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 | Разница |
|---|---|---|---|
| 20 | 3,7 | 4,3 | +0,6 |
| 28 | 11,0 | 13,6 | +2,6 |
| 40 | 29,7 | 27,6 | −2,1 |
| 64 | 63,3 | 55,5 | −7,8 |
| 96 | 102,3 | 91,6 | −10,7 |
| 128 (средне-серый) | 140,0 | 128,7 | −11,3 |
| 160 | 176,7 | 167,1 | −9,6 |
| 224 | 242,7 | 240,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 нет системного плеера, с кривой которого все сравнивают.