Vasily Zakharov (jolaf) wrote,
Vasily Zakharov
jolaf

Category:

Борьба за чёрный цвет

Как вы наверное знаете, я последние несколько лет немножечко развлекаюсь монтажом видео. И одна из проблем, с которой я безуспешно бился все эти годы, заключается в следующем – я монтирую видео в Adobe Premiere, делаю из него авишку, запускаю её на просмотр, и вижу, что цвета на экране не совсем такие, какие были у меня в Премьере при монтаже. А именно, вместо чёрного цвета наблюдается непонятный бледно-серый. Вот нет в картинке чёрного цвета, хоть ты тресни – в Премьере был, а в авишке нету. Показываешь готовое видео друзьям и расстраиваешься. Очень, очень это обидно, особенно после того, как в Премьере потратишь много часов на цветокоррекцию и тщательную ручную подгонку цветов под то, что хочется видеть. Самое забавное, что при изготовлении DVD этой проблемы не возникает, но, по ряду причин, DVD – не самый удобный для меня формат, хочется делать именно обычную авишку, которую можно выложить в Сеть и которую кто угодно сможет посмотреть.

В общем, давеча эта проблема утомила меня окончательно, и я таки собрался, посоветовался с умными товарищами на форуме Adobe Premiere на forum.ixbt.ru, провёл серию экспериментов с точными замерами цветов, и, кажется, наконец окончательно во всём разобрался и нашёл устраивающее меня решение. Выводы излагаю ниже, вдруг кому пригодятся. Эксперты на форуме их, в целом, одобрили. Итак, по пунктам:

0. Корень проблемы лежит в существовании стандарта цифрового видеоизображения ITU-R BT.601, который, в частности, регламентирует, что значение яркости (1 байт, значения от 0 до 255) в видеофайле интерпретируется таким образом, что 16 – это чёрный, 235 – это белый, а всё, что выходит за эти рамки – это недосвет/пересвет, и также считается чёрным/белым соответственно. При этом на мониторе компьютера, естественно, чёрный – это 0, а белый – это 255. Всё дальнейшее является следствием того, как разные программы относятся к этому стандарту в применении к разным форматам файлов.

1. Есть формат Uncompressed AVI, который получается из Премьера экспортом в Microsoft AVI, Compressor: None. Этот формат замечателен тем, что Премьер, VirtualDub, Canopus ProCoder и все опробованные мной проигрыватели дружно забивают на ITU-R BT.601 и понимают этот формат совершенно одинаково и совершенно правильно – цвета выглядят одинаково в любой программе, чёрный это чёрный, белый это белый. Картинка визуально выглядит правильной, "тёмной", такой же, как и в монтажном окне Премьера. Одна проблема у этого формата – он даёт совершенно чудовищного размера файлы.

2. Есть все остальные опробованные мной форматы (DV, DivX, H264, MPEG2). С ними есть следующая проблема:

2.1. Премьер, VirtualDub и Canopus ProCoder открывают их в соответствии с ITU-R BT.601: они считают, что всё, что 16 и темнее это чёрный, а всё, что 235 и светлее это белый, то есть растягивают динамический диапазон 16-235 до 0-255. Если при этом изображение в файле имеет реальный диапазон 16-235, то картинка визуально выглядит правильной, "тёмной". Если же изображение в файле имеет диапазон 0-255, то динамический диапазон тупо обрезается, детали в тенях и светах пропадают, картинка визуально выглядит "слишком тёмной".

2.2. Все опробованные мной проигрыватели (Windows Media Player 11, LightAlloy, Media Player Classic, VLC, PowerDVD) забивают на ITU-R BT.601 и открывают эти файлы тупо: они считают, что 0 это 0, 16 это 16, 235 это 235, а 255 это 255, то есть оставляют динамический диапазон таким, какой он есть. Соответственно, если изображение в файле имеет реальный диапазон 16-235, то в итоговой картинке цвета темнее 16 и светлее 235 просто остутствуют, настоящего чёрного и белого нет как класса, картинка визуально выглядит "серой" (это та самая, описанная в шапке поста проблема). Если же изображение имеет диапазон 0-255, то картинка выглядит правильной, "тёмной".

2.3. Исключение: если экспортить из Премьера в Microsoft DV, то VirtualDub откроет этот файл "серым".

2.4. Эта ситуация не зависит от того, включён или выключен ffdshow, от того, каким именно (из перечисленных) кодеком запакован файл, использует ли проигрыватель системные кодеки или нет (как VLC), рендерится файл непосредственно или через видео-оверлей – результат всегда одинаковый.

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

3. Таким образом, используя любой из перечисленных форматов, кроме Uncompressed, мы имеем косяк – либо мы делаем файл 16-235, и тогда в Премьере, Дабе и Канопусе всё ок, а в проигрывателях всё "серое", либо мы делаем файл 0-255, и тогда в проигрывателях всё ок, а в Премьере, Дабе и Канопусе всё "слишком тёмное", динамический диапазон обрезан.

3.1. Судя по всему, честного решения у этой проблемы нет, нужно при создании файла понимать, делается он для дальнейшей обработки (и тогда делать его 16-235) или для проигрывания (и тогда делать его 0-255).

3.2. Есть ещё вариант поискать другие кодеки, но тут всё упирается в то, что не хочется заставлять конечного пользователя скачивать и ставить экзотический кодек, чтобы посмотреть файл.

3.3. Мне советовали попробовать обратиться к "закрытым" стандартам, типа Windows Media или QuickTime, но я почему-то испытываю к ним стойкую неприязнь.

4. Теперь собственно о том, как из Uncompressed получить упакованный файл (скажем, DivX) 0-255 или 16-235.

4.1. VirtualDub всегда генерит 16-235 файл, путём сжатия динамического диапазона, то есть 0 переводит в 16, а 255 в 235. Если файл исходно был 16-235, то результат получается эквивалентен исходнику (так как при открытии VirtualDub его "растянул", см. 2.1), если же файл исходно был 0-255, то он вначале обрезается при открытии, а потом компрессируется до 16-235 при экспорте – то есть, общая наблюдаемая яркость сохраняется, но всё, что было темнее 16 становится 16, а всё, что было светлее 235 становится 235 – собственно, это самый убогий из возможных вариантов. И в любом случае, авишки, сгенерённые VirtualDub-ом при проигрывании всегда будут "серыми".

4.2. Canopus ProCoder генерит 0-255 файл. Но его можно заставить, если нужно, генерить 16-235 файл (сжимая динамический диапазон) путём наложения встроенного фильтра "601 Correction - Shrink Color Space".

5. Выводы:

5.1. Исходники с камеры при проигрывании выглядят высветленными, "серыми", но Премьер показывает правильные "тёмные" цвета.

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

5.3. Окончательную перепаковку для проигрывания нужно делать ПроКодером, чтобы получить на выходе честный 0-255.

5.4. Не нужно использовать для генерации итоговых файлов VirtualDub!

5.5. Для моих задач правильной технологической цепочкой выглядит следующая. Отдельные сцены экспортим из Премьера в Uncompressed. Итоговое видео собираем из этих Uncompressed и экспортим опять же в Uncompressed. Результат потом перепаковываем во все нужные форматы ProCoder-ом. Собственно до сих пор мы всё делали так же, но на последнем этапе использовали VirtualDub – и в этом был корень проблемы.

Такие вот дела. Если кто-то сможет это как-то прокомментировать, указать на неточности или, тем паче, ошибки – я буду очень благодарен.
Tags: video
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 31 comments