Около года назад я также заинтересовался созданием 10-битных рипов с DCP.
Ниже я расскажу, какие у меня проблемы были с созданием 10-битных рипов, и как я их все в итоге разрешил.
А в самом конце этого сообщения вы найдёте мой конвертер "DCP HQ rip maker", предназначенный для создания высококачественных рипов с DCP, и который является результатом всех моих исследований, наблюдений и наработок по созданию рипов с DCP, описанных в этом сообщении. Под высококачественным рипом с DCP понимается 10-битное видео с субдискретизацией насыщенности 4:4:4 и полным цветовым диапазоном.
Изначально интерес был вызван появлением в интернете DCP-рипа тизер-трейлера "Как приручить дракона 2" в вертикальной анаморфной стереопаре. На тот момент я уже знал, что такое DCP, что у него глубина цвета 12 бит на канал с субдискретизацией насыщенности 4:4:4, и я даже как-то пробовал разбирать какой-то DCP при помощи "OCT", который я когда-то скачал где-то отсюда:
http://cinemaprofs.ru/viewtopic.php?f=7&t=2. И мне захотелось достать этот самый DCP тизер-трейлера "Как приручить дракона 2", потому что я просто хотел посмотреть в нём на картинку, заценить 12-битную глубину цвета и поиграться с уровнями в Photoshop'е. :3 А также очень хотелось послушать 5.1 lossless звук в дубляже, там в тизер-трейлере играет шикарная композиция от Audiomachine.

Связавшись с автором того самого рипа тизер-трейлера в вертикальной анаморфной стереопаре, мне удалось достать сперва 3D DCP тизер-трейлера, а потом и 2D DCP. После извлечения кадров из DCP и преобразования их в TIFF с помощью OCT, я начал их рассматривать и изучать. А потом мне стало интересно, а что если попробовать создать 10-битный рип в качестве эксперимента? До этого я уже встречал в интернете 10-битные рипы аниме, а также 10-битный рип мультфильма Синтел в 4K, выглядели они здорово. Но мне не понравился способ, которым было закодировано 10-битное видео Синтел - для кодирования 10-битного видео там использовался AviSynth, но поскольку AviSynth поддерживает максимум 8 бит на канал, то автор рипа использовал обход, суть которого в предварительном разделении через ImageMagick верхних 8 бит и нижних 8 бит картинки, создавая таким образом 8-битные кадры с двое большим разрешением по вертикали, где были таким образом записаны все биты. Я решил попробовать поискать в интернете, есть ли какие-нибудь способы закодировать настоящие 10-бит напрямую с последовательности кадров.
И в результате поисков я наткнулся на вот эту тему:
http://forums.akross.ru/cgi-bin/ikonboard.cgi?act=ST;f=2;t=6841 Где было написано про некий VapourSynth, который, согласно написанному, поддерживал 16 бит на канал, в отличие от AviSynth, и позволял таким образом закодировать "труЪ" 10 бит. Я решил попробовать сделать с его помощью рип, и начал разбираться.
Для начала написал батник, с помощью которого через ImageMagick сконвертировал все tiff в 16-битные png. Установил Python, VapourSynth с
официального сайта (на тот момент на сайте был VapourSynth версии r19) и создал скрипт для VapourSynth, используя пример из темы, попутно разбираясь с языком Python, делая ошибки в коде тут и там.

И где-то кажется то ли на этом этапе, то ли на последующих (точно уже не помню) у меня появилась проблема, что VapourSynth отказывался принимать последовательность изображений, выдавая ошибку, что якобы поддерживаются только постоянные пиксельные форматы. Причём с одной последовательностью кадров VapourSynth работал, а с другой выдавал ошибку. Начав изучать последовательность кадров, я обнаружил причину ошибки - как оказалось, ImageMagick полностью чёрные кадры сохранял автоматом с глубиной цвета в 1 бит, а не в 48 бит. После чего я нашёл команду в ImageMagick, позволяющую насильно задавать формат PNG, после чего все кадры стали в 48 бит и эта проблема разрешилась. Так удалось в первый раз полностью закодировать тизер-трейлер.

Поскольку 10-битные рипы так или иначе смотрят на компьютере, я решил делать рип именно в полном цветовом диапазоне pc range (0-255), чтобы сохранить как можно больше цветов из 12 битных кадров. Одновременно выяснилось, что ffdshow по умолчанию после установки воспроизводит видео в диапазоне 16-235 (tv range), и на первых порах картинка при воспроизведении выглядела слишком тёмной и контрастной, пока я в настройках ffdshow на вкладке "RGB преобразование" (RGB conversion) не установил автоматический выбор входных уровней (Input levels) (у LAV же всё с этим нормально и ничего менять не нужно в настройках). Тогда отображение видео при воспроизведении через ffdshow стало нормальным.
Но это на первый взгляд. В ходе сравнения получившегося рипа с оригинальными кадрами я обнаружил некое малозаметное искажение цветов в рипе. Как будто бы изображение слегка порозовело. Уж не помню, сколько времени я выяснял, в чём причина этого, но в конце концов, экспериментируя так и сяк, обнаружил, что это искажение цветов происходит при выводе в цветовые пространства Y410 и Y416 (LAV и ffdshow соответственно), при чём это не проблема самого видео, так как в RGB32 цвета отображаются как должны, а проблема некорректной обработки в этих цветовых пространствах видео с полным цветовым диапазоном (PC range). С этого момента я стал воспроизводить 10-битное видео в полном цветовом диапазоне только с установленным выводом в RGB32 в настройках ffdshow.
Дальше я уже начал экспериментировать с настройками кодирования x264 и подбирать наилучшие настройки для кодирования 10-битного 4:4:4 видео, читая разнообразную литературу и советы в интернете, ориентируясь при этом на
рип мультфильма Синтел от
MaLLIeHbKa. Это я пожалуй пропущу. Скажу только лишь, что кодировать рипы с DCP лучше всего с CRF, тогда обеспечивается постоянное качество картинки на протяжении всего видео.
Свой рип тизер-трейлера "Как приручить дракона 2" в Hi444PP и Hi10P я решил выложить на рутрекер, как первый своего рода рип с DCP в таком формате, и сделал я это в сентябре 2013 года. Позже я в ноябре выложил свой рип тизер-трейлера в полной вертикальной стереопаре с разрешением 2048х1716 и обычным 8-битным 4:2:0 видео, которое я закодировал, используя обычный скрипт AviSynth и MeGUI. Но я ещё не был в курсе о кое-каких недостатках преобразования кадров и настроек кодирования. О них я постепенно начал узнавать сам, после того, как в феврале 2014 появился DCP первого трейлера "Как приручить дракона 2".
Тогда казалось не нужным делать дизеринг с 12 до 10 бит, поскольку само видео и так выглядело классно и я не был уверен, так ли этот дизеринг нужен в случае 10-битного видео... После того, как я выложил рипы этого трейлера с 3D DCP в вертикальной анаморфной и вертикальной полноразмерной стереопарах, которые я сделал с помощью всё того же AviSynth MeGUI (то есть без дизеринга), я решил провести ряд тестов со скриптами VapourSynth касательно дизеринга видео до 8 бит и до 10 бит, и я понял, что дизеринг нужен даже 10-битным видео, пускай отличия и не заметны практически. Таким образом рип нового трейлера в 2D Hi444P Hi10P я уже сделал с дизерингом "Sierra-2-4A error diffusion (Filter Lite)", который по результатам тестов мне понравился больше всего. Кроме того, я также пытался задействовать встроенный в x264 дизеринг, который автоматически включается, если ему подавать на вход видео с глубиной больше 10 бит, но качество работы у него оказалось хуже, нежели чем у Sierra-2-4A error diffusion через VapourSynth.
Примерно в это же время я при тщательном сравнений скриншотов из рипа с исходными кадрами в PNG (сравнивал из любопытства и так же с целью оценки качества видео получившегося рипа) обнаружил, что скриншоты из рипа были почему-то на 1-2 пункта светлее, чем оригинальные исходные кадры. То есть, например, вместо R165 G30 B70 было R167 G31 B72. Сперва я подумал, что это быть может как-то виноват рендер MadVR. Или может быть это происходит потому, что видео 10-битное. Или же из-за того, что оно было закодировано в полном цветовом диапазоне. Так или иначе, я хотел добиться полного соответствия видео рипа оригинальным кадрам в плане цветов и яркости, поэтому я начал проводить разнообразные тесты с видео и рендерами. Но причина была ни в рендере, ни в самом видео. Когда я уже начал экспериментировать с настройками ffdshow, через который я снимал скриншоты (поскольку через MPC-HC нельзя делать скриншоты с рендером MadVR), я неожиданно обнаружил, что после включения опции "Дизеринг" на вкладке "RGB преобразование" скриншоты стали получится уже такими, какими должны быть, то есть неосветлёнными. Всё дело в том, что, как я уже говорил, я ориентировался на рип "Синтел" от MaLLIeHbKa. Там у Машеньки к скриншотам есть примечание "Скриншоты сняты через ffdshow r4471 с выводом в RGB32, включенной галкой «High quality YV12 to RGB conversion» и отключенным дитерингом.". Я подумал, что именно таким образом и нужно снимать скриншоты с 10-битного видео - чтобы наверно показать, что плавные градиенты у видео есть благодаря именно 10-битной глубине, а не дизерингу ffdshow. Я и предположить не мог, что эта опция дизеринга может делать видео светлее. И в результате проблема оказалась не в самом видео, а в настройках ffdshow. С этого момента я стал делать скриншоты из 10-битного видео с включённой опцией "Дизеринг" в ffdshow. Соответствие оригиналу превыше всего. Тем более, что я не увидел особой разницы в плавности градиентов между скриншотами, снятыми с включённой опцией дизеринга в ffdshow и без.
Позже появились DCP первых 5 минут фильма "Как приручить дракона 2", а также второго трейлера. И примерно в это самое время я обратил внимание на некий странный бандинг на очень тёмных участках видео. Раньше я ему не придавал особого значения, думал, что быть может это так было закодировано видео в самом DCP. Его толком было и не увидеть на обычной кадре на мониторе, только в Photoshop через изменение уровней, или же на моём телевизоре Samsung, который очень хорошо показывает тёмные участки видео (так уж он показывает). Но впервые я заострил своё внимание на этом бандинге после того, как просто ради интереса открыл оригинальный j2c-кадр в Photoshop и с удивлением обнаружил, что там на этих самых тёмных участках нет никакого бандинга и что там есть гораздо больше деталей в них. Тогда я понял, что что-то происходит не так при конвертировании через ImageMagick. Раньше я просто использовал строку для конвертации из j2c в tiff через ImageMagick, какая она была в OCT, выложенном в той теме на форуме cinemaprofs.ru, и я не разбирался, что же именно она делает. И теперь настало время разобраться. После прочтения информации в интернете я понял, что там с помощью команд в этой строке выполняется преобразование кадра из цветовой модели XYZ, которая используется в стандарте DCI, в цветовую модель RGB с точкой белого D65, которая используется в PNG и в нашем h264 видео. Выполняется это преобразование следующим образом:
1. Гамма снижается с 2.6 до 1.0, то есть умножается на 1/2.6, что приблизительно равняется 0.3846153846153846 - это нужно для приведения изображения к линейному RGB.
2. Применяется матрица для преобразования из XYZ в RGB, являющейся обратной матрице из RGB в XYZ. Данную матрицу можно найти в интернете, например, на
этом сайте.
3. Гамма восстанавливается до стандартной для RGB 2.2, то есть умножается на 2.2.
Так вот, я решил посмотреть, как же будет выглядеть изображение, если не выполнять полностью преобразование цветовой модели, а только лишь снизить его гамму с 2.6 до 1.0 через тот же самый ImageMagick, что я использовал для конвертации, и что поставлялся вместе с OCT, который я скачал на форуме. Снизив гамму, я открыл получившееся изображение в Photoshop, начал постепенно осветлять картинку, увеличивая уровни (выполняя преобразования 0-2 -> 0-255), и наконец увидел то, что ожидал - те самые артефакты и бандинг на изображении, которые я видел ранее. И я понял, что, оказывается, 16 бит просто недостаточно, чтобы достоверно передать такие тёмные участки. Из-за недостаточной точности расчётов и происходит эта самая потеря информации в тёмных областях. Самые тёмные участки как бы "сплющиваются". Детали потеряны, и потом уже, после применения матрицы и восстановления гаммы до 2.2, эти тёмные участки с потерянными деталями выглядят как артефакты и бандинг.
Одновременно я понял, что для того, чтобы избавиться от этих артефактов, нужно при преобразовании из XYZ в RGB использовать расчёты с точностью как минимум 32 бита на канал. Я начал искать в интернете, существует ли программы, способные преобразовывать изображения с такой точностью. К счастью, я обнаружил, что существует специальная версия ImageMagick, которая поддерживает HDRI (High dynamic-range imaging) - собственно высокоточные преобразования и расчёты. В 64-битных версиях ImageMagick, а также начиная с версии 7.0.0 этот самый HDRI включён по умолчанию. И когда я установил ImageMagick 7.0.0 x64 с HDRI и стал его использовать для преобразования 12-битных .j2c в 16-битные .png (при этом я решил больше не использовать openjpeg из OCT для преобразования кадров, так как оказалось, что можно напрямую конвертировать из j2c в png c помощью ImageMagick и качество преобразования при этом будет даже лучше), артефакты наконец пропали и все детали на тёмных участках кадра после преобразования стали сохраняться.

Попутно я заинтересовался вопросом, а как же тогда выполняют преобразование из XYZ в RGB другие программы?
Для того, чтобы это выяснить, я провёл эксперименты по преобразованию jpeg2000 кадра из XYZ в RGB (PNG) с различными степенями точности расчёта. Я сделал преобразования одного и того же кадра с точностью расчётов 8 бит на канал (использовал ImageMagick с Q8), 16 бит на канал (использовал ImageMagick с Q16) и HDRI (использовал ImageMagick с HDRI, условно назову 32 бита на канал). Также посмотрел, как выполняют преобразования LAV (через DirectShowSource или MPC-HC), ffms2. ffdshow, как я обнаружил, не умеет выполнять конвертацию jpeg2000 кадров. То есть он такие видео (mxf-файлы) вообще не может воспроизводить. В качестве тестового изображения решил взять кадр из первого трейлера "Как приручить дракона 2", поскольку там есть очень хорошие тёмные сцены с большой глубиной. Вот получившиеся изображения:
8 бит (ImageMagick Q8), искажения до 114 уровня (из 255):
16 бит (ImageMagick Q16), искажения до 8 уровня (из 255). Рядом для наглядности осветлённое через преобразование уровней 0-28 -> 0-255 изображение.
32 бита (ImageMagick HDRI), искажений нет. Рядом осветлённое через преобразование уровней 0-28 -> 0-255 изображение.
ffms2, искажения до 32 уровня (из 255). Рядом осветлённое через преобразование уровней 0-28 -> 0-255 изображение.
LAV, искажения до 32 уровня (из 255). Рядом осветлённое через преобразование уровней 0-28 -> 0-255 изображение.
И ещё просто оригинальный кадр, преобразованный из j2c ([url=http:// СПАМ на исходный файл[/url]) в PNG без преобразования гаммы и цветов (то есть без конверсии из xyz в rgb):
После сравнения изображений, полученных через ffms и LAV, с кадрами, полученными через ImageMagick с точностью расчётов 8 бит и 16 бит на канал, я сделал вывод, что расчёты для преобразования из XYZ в RGB в ffms2 и LAV ведутся с точностью 12 бит на канал. По всей видимости, те, кто делал конвертацию из XYZ в RGB в ffms2 и LAV, решили ограничиться в точности расчётов глубиной цвета jpeg2000 кадра DCP, то есть 12 бит на канал. Скриншот через ffmpeg я не стал делать, поскольку я посмотрел, как выполняются в коде расчёты для преобразования из XYZ в RGB, и понял, что там тоже 12 бит. Собственно, вот
здесь на сравнении на третьей картинке тоже можно увидеть, что расчёты в ffmpeg идут в 12 бит.
Кстати, с помощью VapourSynth можно напрямую перекодировывать jpeg2000-видео из mxf в h264 10-бит 4:4:4 видео без разложения на кадры, но так как VapourSynth для этого использует плагин fmss2, то расчёты там происходят с глубиной 12 бит на канал, поэтому артефакты и бандинг на тёмных участках остаются.
То есть на данный момент пока невозможно без разложения на кадры напрямую качественно перевести 12-битное jpeg2000-видео из mxf в 10-битное h264 видео без артефактов и потери нижних битов (то есть тёмных областей кадра). По крайней мере до тех пор, пока преобразования видео не будут выполняться с точностью 32 бита на канал.
Итак, после всего этого я стал использовать ImageMagick с HDRI. Но на этом проблемы не закончились.
Я сделал рипы второго трейлера "Как приручить дракона 2" в 2D 4:4:4 10-бит, в вертикальной полноразмерной стереопаре 8 бит 4:2:0 и вертикальной анаморфной стереопаре 8 бит 4:2:0. При этом вертикальную полноразмерную стереопару я решил закодировать уже через VapourSynth, для этого написал специальный скрипт - чтобы закодировать видео уже с использованием дизеринга до 8 бит. Только анаморфную стереопару решил закодировать через AviSynth MeGui, как и в прошлые разы.
Аналогичным образом сделал рипы первых пяти минут. Везде уже использовал для конвертирования изображений ImageMagick с HDRI.
Я выложил рипы второго трейлера на рутрекер. А спустя пару дней вдруг увидел, что в рипах вертикальной анаморфной стереопары картинка получилась почему-то темнее, чем должна быть. o_O При этом раньше такого не было. Начав выяснять, в чём дело, я обнаружил, что AviSynth, с помощью которого я кодировал рипы в анаморфной стереопаре, ведёт себя так только с теми кадрами PNG, которые создал ImageMagick с HDRI. Я решил, что это некий странный баг чтения последовательности 16-битных PNG в AviSynth - потому что в рипе полноразмерной вертикальной стереопары, который я закодировал с помощью VapourSynth, используя те же самые файлы PNG, картинка была такая, какая должна быть. Пришлось начать писать скрипт VapourSynth для кодирования вертикальной анаморфной стереопары, чтобы потом переделать рипы. Но тут уже начались проблемы с VapourSynth и плагинами к нему. К тому времени уже вышел VapourSynth r23, и я решил обновиться. Как потом оказалось, напрасно.
Новый VapourSynth версии r23 уже поддерживал 64-разрядные ОС, в отличие от версии r19, которую я всё это время использовал. Кроме того, туда добавили возможность добавления чёрных полос. Я снёс 32-битный Python и VapourSynth r19, и установил 64-битный Python и VapourSynth r23 x64. После чего скачал и поставил новые версии плагинов для 64-битной версии VapourSynth, в том числе плагин для чтения последовательностей кадров vsimagereader.dll. Но новый VapourSynth не захотел больше читать последовательность кадров, как это ни странно, постоянно выдавая ошибку "No frame returned at the end of process". В теме плагина кто-то сообщил о той же самой проблеме (
http://forum.doom9.org/showthread.php?p=1658233#post1658233). Я понял, что эта ошибка появилась после обновления либо VapourSynth либо плагина. Попробовал на всякий случай установить 32-битный Python и 32-битный VapourSynth r23, но это ничего не дало. В результате пришлось удалить VapourSynth r23 и установить старую версию r19, где плагин работал исправно.
Таким образом для меня стало более невозможным добавить через скрипт VapourSynth чёрные полосы к видео для создания правильной анаморфной стереопары с разрешением 1920х1080 (просто в r19 функция добавления чёрных полос ещё работает неправильно). Пришлось импровизировать и создавать уже готовые кадры для вертикальной анаморфной стереопары уже с помощью ImageMagick. Таким образом удалось переделать рипы в вертикальной анаморфной стереопаре второго трейлера и первых пяти минут фильма "Как приручить дракона 2", видео в которых теперь стало выглядеть нормально, и, кроме того, картинка стала смотреться лучше за счёт использования дизеринга исходника до 8 бит.
Потом я обновил
раздачу второго трейлера в вертикальной анаморфной стереопаре и выложил все оставшиеся рипы на рутрекер. Попутно переделал 2D-рипы тизер-трейлера и первого трейлера уже с новыми знаниями и создал
раздачу-сборник всех трёх трейлеров в Hi444PP Hi10P.
После я обнаружил, что кадры PNG, созданные ImageMagick с HDRI, также отображаются более тёмными в браузере (когда их заливаешь, например, на хостинг изображений). При этом в обычном просмотрщике изображений или Photoshop'е они отображались нормально. Я начал думать, что скорее всего что-то есть такое в самих PNG, что заставляет делать картинку более тёмной либо же наоборот делает её нормальной для просмотрщиков. Для выяснения причин начал изучать особенности сохранения формата PNG и какие у ImageMagick есть возможности по настройке сохранения изображения в этом самом формате PNG. После возни с кучей параметров у ImageMagick, когда я уж совсем было отчаялся, я наконец методом тыка каким-то образом нашёл то, что нужно. С помощью команды консоли -define png:include-chunk=none мне удалось добиться нормального отображения PNG в браузере, и не только - AviSynth тоже стал нормально их считывать без искажений.
Как оказалось, внутри PNG есть блоки данных, называющихся chunk'ами. В этих блоках может записываться информация, например, о палитре и гамме. Вероятнее всего, при конвертации ImageMagick записывал или же сохранял какую-то информацию о цвете в chunk'и в PNG, которую потом определённые программы считывали. Команда -define png:include-chunk=none же отключила добавление какой-либо информации в PNG.
Правда, на качество создания рипов это никак не повлияло. Просто нашёл истинную причину затемнения картинки в рипе вертикальной анаморфной стереопары, созданном через AviSynth. Но в любом случае команда не лишняя.
Подводя итоги: все мои основные наблюдения
- Если принудительно не задать ImageMagick формат сохранения PNG с помощью ключей -define png:color-type=2 и -define png:bit-depth=16, то он может сохранить изображение с меньшей глубиной цвета, что приведёт к ошибке при создании рипа через VapourSynth.
- ffdshow по умолчанию после установки воспроизводит видео в стандартном диапазоне 16-235 (tv range), и для того, чтобы он мог корректно воспроизводить видео с полным цветовым диапазоном необходимо в настройках ffdshow на вкладке "RGB преобразование" (RGB conversion) установить автоматический выбор входных уровней (Input levels).
- При воспроизведении 10-битного 4:4:4 видео с выводом в цветовые пространства Y410 и Y416 (LAV и ffdshow соответственно) происходит небольшое искажение цветов, но это не проблема самого видео, так как в RGB32 цвета отображаются как должны, а проблема некорректной обработки в этих цветовых пространствах видео с полным цветовым диапазоном (pc range). Для правильной передачи цветов можно вручную выставить вывод в RGB32 в настройках ffdshow.
- Выключение опции "Дизеринг" на вкладке "RGB преобразование" в настройках ffdshow немного искажает отображение видео, осветляя картинку на 1-2 пункта. То есть, например, вместо R165 G30 B70 становится R167 G31 B72. Дизеринг нужно использовать всегда.
- Дизеринг нужно стараться использовать всегда.
- Для качественного безпотерьного преобразования j2c-кадров с цветовой моделью XYZ в PNG с цветовой моделью RGB необходима точность расчётов как минимум 32 бита на канал, в противном случае на тёмных участках изображений появляются артефакты и бандинг. На данный момент такую качественную конвертацию изображения может делать только ImageMagick с HDRI.
- ImageMagick с HDRI добавляет в 16-битные PNG при преобразовании из j2c какую-то информацию о цветах или гамме, что приводит к искажению цветов при чтении этих PNG какими-нибудь программами вроде AviSynth или браузера. Для того, чтобы ImageMagick ничего не добавлял, нужно использовать ключ -define png:include-chunk=none.
- 10-битное 4:4:4 видео с полным цветовым диапазоном выглядит потрясающе!

О DCP HQ rip maker
В результате всего этого я решил все свои наблюдения и наработки использовать для создания конвертера, предназначенного для практически автоматизированной конвертации DCP в MKV с 10-битным видео и субдискретизацией насыщенности 4:4:4 в полном цветовом диапазоне. Проще говоря, для создания высококачественных рипов с DCP (незашифрованных). Назвал я этот конвертер как "DCP HQ rip maker". Специально для этого конвертера я также скомпилировал свою собственную сборку ImageMagick 6.8.9 x64 с HDRI, которая может работать без установки. Мне пришлось его сделать эту сборку самому потому что нигде в интернете я не нашёл портативный 64-разрядный ImageMagick с поддержкой HDRI.
Скачать мой "DCP HQ rip maker" можно по следующим ссылкам: http:// СПАМ или
https://mega.co.nz/#!3Y4UmYbJ!c0NtfEplxR0tkBZ0fv97YGuwNKsqQ8HCBo7TI4fUVr4
Перед тем, как начать работать с конвертером, сначала необходимо установить на компьютер Python версии 3.3.x, а после него - VapourSynth r19. Они необходимы для полноценной работы конвертера. Оба дистрибутива поставляются вместе с конвертером. Это единственное, что требуется установить. При этом сам конвертер может работать из любой папки, куда его поместят. В корневой папке конвертера есть текстовый файл с подробным описанием конвертера и инструкцией к нему, здесь я вкратце напишу основное.
Конвертер представляет собой набор скриптов (батников), куда пользователем вносятся необходимая информация о DCP и параметры кодирования рипа, а также набор программ, необходимых для конвертирования DCP и создания рипа. Достаточно только внести информацию о DCP и запустить скрипт, и спустя время получить готовый рип в контейнере MKV с 10-битным видео, субдискретизаций насыщенности 4:4:4, и звуком во FLAC. Конвертер сам извлекает JPEG2000 кадры из DCP, качественно преобразует их из цветовой модели XYZ в цветовую модель RGB без потерь информации, сохраняя получившиеся после преобразования кадры в 16-битные PNG, выполняет само кодирование последовательности кадров PNG в h264 видео, режет и кодирует звук во FLAC, и выполняет сборку получившихся файлов видео и аудио в контейнер MKV.
Возможности данного конвертера:
- Кодирование видео с глубиной цвета 8 или 10 бит (в обоих случаях с использованием дизеринга);
- Кодирование видео с субдискретизацией насыщенности 4:2:0, 4:2:2 или 4:4:4;
- Кодирование видео в стандартном цветовом диапазоне tv range (16-235) или в полном цветовом диапазоне pc range (0-255);
- Обрезка кадра DCP по ширине и по высоте;
- Изменение размера видео по заданной ширине с соблюдением пропорции и учётом обрезки кадра;
- Создание вертикальных полноразмерных и вертикальных анаморфных стереопар - со всеми возможностями по кодированию видео и редактированию размера кадра видео. Для вертикальных анаморфных стереопар скрипт кодирует звук в AC3 для обеспечения совместимости с 3D-телевизорами;
- Возможность создания рипа из уже имеющейся последовательности кадров PNG;
- Пользовательская настройка строки кодировщика x264.
Используемое программное обеспечение в конвертере: Open Cinema Tools 1.1.2, ImageMagick x64 6.8.9 Portable моей сборки с включённым HDRI, VapourSynth r19 (с плагинами vsimagereader.dll и fmtconv.dll), x264 rev2431 tMod x64 - 8 и 10 бит, eac3to 3.27, MKVToolNix v7.1.0.
Среди недостатков могу отметить использование 32-битного VapourSynth и 32-битного Python'а из-за отсутствия рабочей версии плагина vsimagereader.dll для 64-битного VapourSynth. Кроме того, используется VapourSynth старой версии r19, так как рабочего плагина чтения последовательности PNG для текущей версии VapourSynth r23 нет (на момент написания поста). Попытка спросить, когда исправят плагин в теме автора плагина на форуме doom9 ни к чему толком не привела. Также ещё один недостаток - необходимость вручную вносить некоторую информацию о DCP: прописывать пути до файлов MXF с видео и аудио, а также задавать начальный кадр видео, продолжительность видео и начало аудио. При этом можно кодировать только одну пару mxf-файлов видео и аудио, но в принципе можно последовательно соединить получившееся части с помощью MKVmerge, при условии, что все эти части кодировались с одинаковыми настройками.
Отдельно скажу про использование оперативной памяти. Для того, чтобы закодировать 10-битное видео с субдискретизацией насыщенности 4:4:4 и разрешением 2K требуется не менее 4 Гб оперативной памяти. Для того, чтобы закодировать 10-битное видео с субдискретизацией насыщенности 4:4:4 в полной стереопаре (2048х1716) и разрешением каждого ракурса 2K требуется уже не менее 8 Гб оперативной памяти. А вот для того, чтобы закодировать 10-битное видео с субдискретизацией насыщенности 4:4:4 и разрешением 4K требуется уже никак не меньше 12 Гб оперативной памяти... на что уже мой компьютер оказался не способен, поскольку у меня всего 8 Гб оперативной памяти. Однако всё же закодировать 10-битное 4:2:0 4K видео с 8 Гб оперативной памяти оказалось возможным - так как при субдискретизации насыщенности 4:2:0 разрешение двух цветоразностных составляющих в 4 раза меньше, чем разрешение яркостной составляющей, из-за чего кадр с 4:2:0 весит в два раза меньше, чем кадр с 4:4:4.
В довершение, некоторые мои примеры скриптов для VapourSynth r19:
скрытый текст
Кодирование 10-битного 4:4:4 видео в полном цветовом диапазоне из последовательности кадров PNG
script.vpy
Код:
import vapoursynth as vs
core = vs.get_core()
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\vsimagereader.dll')
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\fmtconv.dll')
import os
ext = '.png'
dir = r'H:\DCP\PNG_Images/'
srcs = [dir src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imgr.Read(srcs,24,1)
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, csp=vs.YUV444P16, bits=16, fulls=1, fulld=1)
v = core.fmtc.bitdepth(v, bits=10, dmode=3)
v.set_output()
convert.bat
Код:
"C:\Program Files (x86)\VapourSynth\core\vspipe.exe" script.vpy - -y4m | x264_64_tMod-10bit-all.exe - --demuxer y4m --preset placebo --ref 12 --input-depth 10 --input-range pc --range pc --input-csp i444 --rc-lookahead 72 --output-csp i444 --sar 1:1 --colorprim bt709 --transfer bt709 --non-deterministic --colormatrix bt709 -f -3:-2 --level 5.0 --crf 12 --qcomp 0.75 --no-dct-decimate --psy-rd 0.5:0.05 --merange 32 -o out_video.264
pause
Кодирование 10-битного 4:4:4 видео в стандартном цветовом диапазоне напрямую без разложения на кадры с помощью плагина ffms2
script.vpy
Код:
import vapoursynth as vs
core = vs.get_core()
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\ffms2.dll')
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\fmtconv.dll')
v = core.ffms2.Source(source='H:\DCP\FoxAgeRaitings_RTG-0-2D_S_RU-XX_XX-XX_2K_FOX_20121020_KNR-reel-1-jp2k.mxf')
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, csp=vs.YUV444P16, bits=16, fulls=0, fulld=0)
v = core.fmtc.bitdepth(v, bits=10, dmode=3)
v.set_output()
convert.bat
Код:
"C:\Program Files (x86)\VapourSynth\core\vspipe.exe" script.vpy - -y4m | x264_64_tMod-10bit-all.exe - --demuxer y4m --preset placebo --ref 12 --input-depth 10 --input-range tv --range tv --input-csp i444 --rc-lookahead 72 --output-csp i444 --sar 1:1 --colorprim bt709 --transfer bt709 --non-deterministic --colormatrix bt709 -f -3:-2 --level 5.0 --crf 12 --qcomp 0.75 --no-dct-decimate --psy-rd 0.5:0.05 --merange 32 -o out_video.264
pause
Но, как уже говорилось, ffms2 выполняет преобразование из XYZ в RGB с точностью расчётов 12 бит на канал, поэтому в видео будут артефакты и бандинг на тёмных участках. Но этот скрипт можно использовать для перекодирования уже существующего 10-битного рипа.
Стоит обратить внимание, что ffms2.Source передаёт кадры в стандартном цветовом диапазоне TV Range, поэтому в fmtc.matrix параметр fulls равен 0 (что значит TV Range на входе). Параметр fulld равный 0 определяет выход в TV Range, если его сделать равным 1, будет выполняться преобразование от TV Range к PC Range.
Кодирование 10-битного 4:2:0 видео в обычном цветовом диапазоне из последовательности кадров PNG
script.vpy
Код:
import vapoursynth as vs
core = vs.get_core()
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\vsimagereader.dll')
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\fmtconv.dll')
import os
ext = '.png'
dir = r'H:\DCP\PNG_Images/'
srcs = [dir src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imgr.Read(srcs,24,1)
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, csp=vs.YUV444P16, bits=16, fulls=1, fulld=0)
v = core.fmtc.resample(v, css="420")
v = core.fmtc.bitdepth(v, bits=10, dmode=3)
v.set_output()
convert.bat
Код:
"C:\Program Files (x86)\VapourSynth\core\vspipe.exe" script.vpy - -y4m | x264_64_tMod-10bit-all.exe - --demuxer y4m --preset placebo --ref 12 --input-depth 10 --input-range tv --range tv --input-csp i420 --rc-lookahead 72 --output-csp i420 --sar 1:1 --colorprim bt709 --transfer bt709 --non-deterministic --colormatrix bt709 -f -3:-2 --level 5.0 --crf 12 --qcomp 0.75 --no-dct-decimate --psy-rd 0.5:0.05 --merange 32 -o out_video.264
pause
Создание вертикальной полноразмерной стереопары с 10-битным 4:2:0 видео в обычном цветовом диапазоне из последовательностей кадров PNG для каждого ракурса
script.vpy
Код:
import vapoursynth as vs
core = vs.get_core()
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\vsimagereader.dll')
core.std.LoadPlugin(path=r'C:\Program Files (x86)\VapourSynth\filters\fmtconv.dll')
import os
ext = '.png'
dirLeft = r'H:\DCP\PNG_left/'
dirRight = r'H:\DCP\PNG_right/'
srcsLeft = [dirLeft src for src in os.listdir(dirLeft) if src.endswith(ext)]
srcsRight = [dirRight src for src in os.listdir(dirRight) if src.endswith(ext)]
vLeft = core.imgr.Read(srcsLeft,24,1)
vRight = core.imgr.Read(srcsRight,24,1)
v = core.std.StackVertical([vLeft, vRight])
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, csp=vs.YUV444P16, bits=16, fulls=1, fulld=0)
v = core.fmtc.resample(v, css="420")
v = core.fmtc.bitdepth(v, bits=10, dmode=3)
v.set_output()
convert.bat
Код:
"C:\Program Files (x86)\VapourSynth\core\vspipe.exe" script.vpy - -y4m | x264_64_tMod-10bit-all.exe - --demuxer y4m --preset placebo --ref 8 --input-depth 10 --input-range tv --range tv --rc-lookahead 72 --input-csp i420 --output-csp i420 --sar 1:1 --colorprim bt709 --transfer bt709 --non-deterministic --colormatrix bt709 -f -3:-2 --level 5.1 --crf 16 --qcomp 0.70 --no-dct-decimate --psy-rd 0.60:0.05 --merange 48 --frame-packing=4 -o out_video_OU.264
pause
В случае VapourSynth версии r23 (и выше) прописывать в скрипте загрузку плагинов уже не нужно, так как в этой версии VapourSynth уже сам автоматически загружает все плагины.
Вообще очень советую изучить вот
эту тему, там очень много полезного написано про VapourSynth.
А вот также в качестве примеров готовых рипов некоторые мои DCPrip'ы трейлеров, которые я сделал в ходе тестов или же просто ради интереса. Все рипы со звуком во FLAC 5.1.
-
Стражи галактики, трейлер D (2D, 2048x858, 10-bit, 4:4:4, pc range, ~37,2 Mbps avg, 475 Мегабайт);
-
Малефисента, трейлер H (2D, 2048x858, 10-bit, 4:4:4, pc range, ~55500 Kbps avg, 889 Мегабайт);
-
Малефисента, трейлер H (3D, 2048x1716, 10-bit, 4:2:0, pc range, ~47,77 Mbps avg, 790 Мегабайт);
-
Оз: Великий и Ужасный, трейлер A (2D, 2048x858, 10-bit, 4:4:4, pc range, ~20,16 Mbps avg, 313 Мегабайт);
-
Оз: Великий и Ужасный, трейлер A (3D, 2048x1716, 10-bit, 4:2:0, pc range, ~14,73 Mbps avg, 243 Мегабайт);
-
Самолёты: Огонь и Вода, трейлер E (2D, 2048x858, 10-bit, 4:4:4, pc range, ~17,52 Mbps avg, 242 Мегабайт);
-
Холодное сердце, трейлер G (2D, 2048x858, 10-bit, 4:4:4, pc range, ~16,19 Mbps avg, 355 Мегабайт);
-
Город героев, трейлер A (2D, 2048x858, 10-bit, 4:4:4, pc range, ~61,1 Mbps avg, 768 Мегабайт);
-
Мстители, трейлер F (2D, 1998x1080, 10-bit, 4:4:4, pc range, ~31,31 Mbps avg, 549 Мегабайт);
-
Король Лев, трейлер A (2D, 1920x1080, 10-bit, 4:4:4, pc range, ~12,98 Mbps avg, 187 Мегабайт).
И, конечно, все мои DCPrip'ы трейлеров фильма "Как приручить дракона 2" [url=tracker.php?nm=как приручить дракона 2 dcprip]можно найти на рутрекере[/url]. Некоторые трейлеры имеют довольно шумный видеоряд, поэтому битрейт в них получился высокий.
Кроме того, на рутрекере есть несколько моих рипов с DCP 4K. Это
тизер и трейлер фильма "Интерстеллар", а также
трейлер фильма "Исчезнувшая". Все эти рипы имеют 10-битное 4:2:0 видео с разрешением 4K.
Оценить качество картинки в рипах можно по следующим скриншотам:
Надеюсь, что этот пост окажется в той или иной мере полезным для тех, кто хотел так или иначе делать рипы с DCP.

Добавление от 7 августа: Выше я написал, что при воспроизведении 10-битного 4:4:4 видео с выводом в цветовые пространства Y410 и Y416 (LAV и ffdshow соответственно) происходит небольшое искажение цветов из-за некорректной обработки в этих цветовых пространствах видео с полным цветовым диапазоном (pc range). Сегодня я решил обновить MadVR и проверить снова, как будет смотреться видео в цветовых пространствах Y410 и Y416 при использовании новой версии рендера MadVR. И обнаружил, что эту проблему исправили - теперь больше никаких искажений цветов нет, всё выглядит так, как должно быть.

Так что теперь можно 10-битное 4:4:4 видео в полном цветовом диапазоне смотреть с правильными цветами при выводе в Y410 и Y416.

Нужен только MadVR последней версии.
Кроме того, я также обнаружил, что теперь создание скриншотов через MPC-HC при использовании MadVR стало возможным.