Videoforum - форум о видео и не только!


Вернуться   Videoforum - форум о видео и не только! > Видеосъёмка и монтаж. > Кодеки и кодеры, кодирование и конвертация.

Важная информация

Кодеки и кодеры, кодирование и конвертация. Тут обсуждаются вопросы изменения формата видео, качество работы кодировщиков, а так-же известные проблемы и решения соответствующие тематике раздела.

Ответ
 
Опции темы
Старый 12.01.2021, 19:35   #1
Жрец Нефтиды
Модератор
 
Аватар для Жрец Нефтиды
 
Регистрация: 15.07.2012
Адрес: Санкт-Петербург
Сообщений: 1,301
Сказал(а) спасибо: 340
Поблагодарили 519 раз(а) в 353 сообщениях
Вес репутации: 494
Жрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond repute
По умолчанию Просмотр и конвертация HEVC (h265) bt2020 10 bit в h264 8 bit

Формат bt2020 отличается от bt709 и bt601. Когда нам нужно было преобразовать, например, bt709 в bt601, то достаточно было подставить коэффициенты, то есть произвести линейное преобразование. Совсем по-другому обстоят дела с bt2020. Можно сказать, что bt2020 – это стандарт, рассчитанный на определённое "железо".
Предположим, у меня (или у тебя) есть старый монитор SDR (Standard Dynamic Range) 8 bit. Слово "старый" я взял в кавычки: например, мой "Панасоник" Full HD, которому 10 лет, за эти годы совсем не утратил цветопередающие способности, и выкидывать его я не собираюсь. Откуда-либо к нам приплыл файл, сжатый кодеком HEVC, он же кодек h265, и Медиаинфо показало "Коэффициенты матрицы" – "BT.2020 non-constant", а "Характеристики трансфера" – "PQ". Некоторые фильмы сейчас можно найти в таком формате, например, "Спартак" 1960-го года. Да, в плеере BE можно включить встроенный декодер HEVC, и показывать-то BE будет без проблем. Без проблем, кроме одной: видео будет блёклое.
Я не буду в этой теме читать морали, а зачем же было скачивать HEVC, если у тебя монитор SDR rec709 8 bit. Я не буду рассуждать, насколько HDR по глазным ощущениям отображает картинку лучше, чем SDR. Я не буду советовать купить более современный монитор, или, наоборот, остаться на SDR. И вас прошу этого не делать. Здесь мы подробно разберём, как решить поставленную задачу: максимально точно, насколько это возможно, воспроизвести десятибитное видео bt2020 на восьмибитном мониторе SDR rec709. А также научимся конвертировать bt2020 в привычный стандарт bt709.
Перед тем, как мы перейдём к практическим действиям, нам нужно осознать отличие стандарта bt709 от bt2020 и теорию преобразования bt2020 в bt709. Без знания теории мы, скорее всего, будем терпеть фиаско. Научным языком теория объяснена, например, в статье [Для просмотра данной ссылки нужно зарегистрироваться] Можешь прочитать, а можешь и не читать. Похоже, что это перевод с английского, так что есть смысл скачать и английский вариант. Я же покажу всю эту кухню на простом примере. Как сказал Эйнштейн, "Если вы не можете объяснить это простыми словами, вы не до конца это понимаете".
Первое, и самое простое, отличие монитора bt2020 10 bit от "старого" монитора налицо: десять бит. То есть больше точность. Но есть и второе, более сложное, отличие.
Перед нами стоит монитор (в статье он называется дисплеем) rec2020 10 bit. Допустим, на данном кадре на красную составляющую какого-либо пикселя подаётся сигнал величиной 783. Относительная величина яркости E=783/1023=0,765. Рядом стоит "старый" монитор rec709 8 bit. Нам нужно, чтобы красная составляющая пикселя этого "старого" монитора светилась примерно с такой же яркостью, как и красная составляющая монитора rec2020. Используя терминологию статьи, эту идею можно описать такой фразой: "если цель заключается в сохранении цветов, видимых на дисплее rec2020, при отображении на дисплее rec709…"
Считаем. E*255=195 ?
А вот и не правильно! Вначале относительную яркость нужно возвести в степень (1/2,4). То есть 0,765**(1/2.4)*255=228 Такое преобразование называется нелинейно-линейное.
Это ещё не всё. Существует понятие "пиковая номинальная яркость", она же "пиковая яркость", она же "максимальная яркость". В английском варианте эта величина называется "nominal peak luminance". Когда мы подойдём к конвертированию, данную величину мы будем задавать опцией npl. В других кодерах и в плеере она может обозначаться по-другому.
Для стандарта SDR пиковая номинальная яркость равна 100. То есть npl=100 нит. Это прописано в самом стандарте SDR. Для "нового" монитора rec2020, работающего, например, по стандарту HDR, эта величина будет больше. Величина npl тоже входит в преобразование. Не будем дальше грузиться математикой, для практики это не важно.
К чему же мы подошли? К тому, что невозможно системой из трёх линейных уравнений перекинуть bt2020 в bt709. Для этой цели нужны более серьёзные математические преобразования. Но не плачь, когда дочитаешь до конца, поймёшь, что на практике всё очень просто.
Теперь возьми лист бумаги, нарисуй квадрат, а в нём график Y=X**(1/2.4). Ты увидишь, что этот график довольно сильно изогнут. То есть когда относительная яркость E входного стандарта bt2020 близка к нулю, то небольшое её изменение приводит к значительным изменениям относительной яркости выходного стандарта bt709. Но ведь на входе у нас 10 бит, на выходе, в конечном счёте, 8 бит. Шкала X оказывается проградуирована более мелкими делениями, чем шкала Y. К чему я это всё говорю? Шевелим древнеегипетской мозговой извилиной. Какая последовательность действий лучше для максимально точной передачи изображения и для того, чтобы минимизировать бандинг: вначале понизить битность до 8, и потом произвести нелинейно-линейное преобразование, или вначале произвести нелинейно-линейное преобразование, а потом понизить битность? Шевелим, шевелим. Так вот, гораздо лучше вначале произвести нелинейно-линейное преобразование, и ресайз, если он нужен, а в самом конце, перед подачей на кодер, понизить битность. Запомним эту важную мысль.
С теорией всё. Переходим к практике.
Из бесплатных в очередной раз лучшим оказался плеер BE.
Первый способ.
Включаем в нём встроенный декодер HEVC. Но это ещё не всё. Обязательно нужно задать Видео-рендерер "Exchanged Video Renderer (custom parameter)". "Формат текстуры" в нём – 10-bit Integer. Зачем 10, когда у древнеегипетского монитора 8? А затем, чтобы всё было максимально точно обработано на 10, и уже потом, при подаче на монитор, было понижено до 8.
Также обязательно нужно на "Встроенные фильтры" – "Видео декодеры" – "Настройка видео декодера" поставить птицу у "YV12".
Если ты не выполнишь какое-либо из этих условий, то видео может получиться блёклое. Попробуй.
Обязательно перезапусти плеер BE, и наслаждайся.
Второй способ. Обязательно нужно задать Видео-рендерер "Exchanged Video Renderer (custom parameter)". "Формат текстуры" в нём – 10-bit Integer.
Встроенный декодер HEVC в плеере здесь отключаем. Птицу у "YV12" ставить не обязательно, можно оставить одну птицу только у RGB32.
Декодирование ведём кодеком LAV. В нём включаем HEVC, а птицу в LAV ставим у "YV12". Лично мне второй способ нравится больше.
Увы, HEVC – кодек ресурсозатратный. Скорости твоего (ну хорошо, моего) древнеегипетского процессора может не хватить для декодирования с заданной частотой кадров. Особенно если исходник имеет разрешение 3840x2160. Тогда уместно заняться конвертированием. О конвертировании я напишу в следующем посту.

Последний раз редактировалось Жрец Нефтиды; 20.01.2021 в 19:18.
Жрец Нефтиды вне форума   Ответить с цитированием Вверх
Реклама на форуме
Старый 13.01.2021, 20:16   #2
Жрец Нефтиды
Модератор
 
Аватар для Жрец Нефтиды
 
Регистрация: 15.07.2012
Адрес: Санкт-Петербург
Сообщений: 1,301
Сказал(а) спасибо: 340
Поблагодарили 519 раз(а) в 353 сообщениях
Вес репутации: 494
Жрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond repute
По умолчанию Максимально точная конвертация HEVC (h265) bt2020 10 bit в h264 bt709 8 bit

Задача: конвертировать (h265) bt2020 10 bit в привычный h264 bt709 8 bit таким методом, чтобы конвертант максимально точно соответствовал оригиналу.
Замечу, что на сегодняшний день я не считаю h264 устаревшим, и если приходится пережимать, то жму только в него. Бесполезно (пока) просить меня помочь конвертировать в h265.
Всё, изложенное здесь, идеально работает на Windows. Не знаю, сработает ли на Пингвине.
Поехали.
При помощи mkvtoolnix-gui, который я называю "матрёшечник", создаём файл, в котором только одна видео дорожка. Назовём его 11.mkv.
Казалось бы, для декодирования на поверхности лежит способ, описанный мною ещё в теме про XVID, а именно, через скрип Ависинта:
LoadPlugin("ffms2.dll")
LoadPlugin("SplineResize.dll")
FFVideoSource("11.mkv", fpsnum=24000, fpsden=1001)
assumefps(24000,1001)
Spline144Resize(1920, 1080)
Но не прокатит. Да, ffms2.dll лихо декодирует HEVC. На том сочтёт свою миссию выполненной. А в степень возводить Марина Цветаева будет? В результате конвертант получится блёклым. По этой же причине не прокатит такой простенький бат-файл:
ffmpeg.exe -i 11.mkv -vf scale=1920:1080:flags=bicubic,format=yuv420p
(Параметры кодирования я в нём не записал.)
Делаем так.
Скачиваем последний официальный релиз ffmpeg.exe. Желательно отсюда, здесь есть и 32-х битные релизы:
[Для просмотра данной ссылки нужно зарегистрироваться]
Скачиваем обязательно статическую версию!
В одной папке располагаем bat-файл, 11.mkv и ffmpeg.exe.
bat-файл пишем так:
ffmpeg.exe -i 11.mkv -vf zscale=dither=none:primaries=709:transfer=709:matr ix=709:npl=100:w=1920:h=1080:filter=spline16,forma t=pix_fmts=yuv420p -aspect 16:9 -codec:v libx264 -x264-params qp=18:no-deblock=1:ipratio=1:pbratio=1:no-psy=1:no-fast-pskip=1:no-dct-decimate=1:deadzone-inter=0:deadzone-intra=0:subme=9:colorprim=bt709:transfer=bt709:col ormatrix=bt709 01.mkv
pause
Подробное объяснение параметров на русском языке.
Если какие-либо описанные ниже параметры представлены в Медиаинфо, то их название здесь будет соответствовать названию в официальном русском интерфейсе Медиаинфо.
-i 11.mkv имя входного файла
-vf Эта команда указывает, что дальше последуют видео фильтры. Видео фильтры – это не опции. Это именно видео фильтры. В какой последовательности ты их напишешь, в такой они и будут применены для обработки видео. Поэтому принципиально важно написать их в нужной последовательности. Один видео фильтр отделяется от другого запятой. У видео фильтра могут быть параметры, они же опции, одна или несколько. Если у фильтра есть опции, то формат записи таков. После имени фильтра пишется знак равенства. После знака равенства пишется имя опции, дальше снова знак равенства, после него значение опции. Если количество опций больше одной, то после значения первой опции ставится двоеточие, далее снова опция=значение, и так далее. Вот опции можно записывать в любой последовательности.
Когда мы напишем команду с дефисом впереди, это будет значить, что видео фильтры закончились.
zscale= Запускаем видео фильтр zscale с множеством опций.
Перед началом конвертирования исследуй 11.mkv Медиаинфо. В списке обязательно должны быть три значения: "Основные цвета" ("Color primaries"), "Характеристики трансфера" ("Transfer characteristics") и "Коэффициенты матрицы" ("Matrix coefficients"). Если они есть – а, скорее всего, так и будет, – то используешь прикреплённый bat-файл, как он есть. Если Медиаинфо не показывает этих значений, то в опции zscale нужно дописать ещё три опции:
primariesin=2020 Для входного потока задаём "Основные цвета" – "BT.2020". Только задаём, ничего не преобразуя.
transferin=smpte2084 Для входного потока задаём трансфер, который в Медиаинфо называется PQ (Perceptual Quantizer). Вот так, немножко необычно. Только задаём, ничего не преобразуя.
zscale=matrixin=2020_ncl Для входного потока задаём "Коэффициенты матрицы" – "BT.2020 non-constant". Только задаём, ничего не преобразуя.
Рассматриваем остальные опции.
dither=none Отключить добавления зерна. По умолчанию и так отключено, но подстрахуемся.
primaries=709 Основные цвета преобразуем в bt709. В руководстве к этому фильтру написано, что значение опции записывается "709" (а не "bt709"). Поэтому так и пишем.
transfer=709 Трансфер преобразуем в bt709.
matrix=709 Коэффициенты матрицы преобразуем в bt709.
npl=100 Объяснено в первом посту. Если мы зададим npl больше 100, например, 400, то это будет значить, что мы пытаемся загнать 400 нит в математическую модель, рассчитанную на 100 нит. В результате получим тёмную картинку. Если мы зададим npl меньше 100, например, 50, то получим ядовито-яркие цвета.
Замечу, что я нигде, даже на англоязычных ресурсах, не нашёл описания опции npl. Наш форум лучший.
w=1920 Ширина в пикселях выходящего кадра.
h=1080 Высота в пикселях выходящего кадра.
Все помнят, что ресайз уместен только в сторону уменьшения размера.
filter=spline16 Алгоритм ресайза. Имхо, сплайн – самый лучший, не звенит.
Что лучше: вначале трансформировать цвета, а потом произвести ресайз, или наоборот? Однозначно я не берусь ответить на этот вопрос. Мы могли бы принудительно задать последовательность этих действий, написав два фильтра zscale. Но мне представляется разумным предоставить самому фильтру возможность решать, в какой последовательности что делать. Поэтому я единым махом записал и трансформацию цветов, и ресайз в опциях фильтра. Будем считать, что программисты фильтра умные.
Запятую видишь? Это значит, что видео фильтр zscale закончил свою работу.
До сих пор мы шли на десяти битах.
format=pix_fmts=yuv420p Задаём выходной формат. Формат yuv420p работает на восьми битах. Поэтому, задавая такой стандартный выходной формат, мы одновременно понижаем битность до 8.
Видео фильтры закончились.
-aspect 16:9 Задаём видимое соотношение сторон. В данном примере оно и так 16:9, но в другом случае видимое соотношение сторон может и не соответствовать пиксельному соотношению сторон.
С декодированием закончено. Прежде, чем перейдём к кодированию, минута отдыха. Я просмотрел очень много форумов на эту тему, и русскоязычных, и англоязычных. И почувствовал себя астролётчиком, прилетевшим с планеты Фрина на планету парадоксов. Количество советов, позволяющих получить правильную цветовую гамму, можно пересчитать по пальцам одной руки. Причём все они повторяют один другого: вначале идёт фильтр линеаризации, то есть значения заменяются приближёнными, само же преобразование в 709 выполняется там ещё в два фильтра. Какая погрешность набежит? Конструкции, предлагаемой мной, где одним фильтром производится трансформация, я не обнаружил нигде. Теперь, возможно, такие конструкции появятся. На здоровье, только большое пожалуйста – со ссылкой на сюда. Наш форум лучший!
В следующем посту разберём опции кодирования и оставшиеся тонкости.
Прилагаю гарантированно работающий bat-файл. В архиве также найдёшь вордовский файл, в который я скопировал из огромного файла помощи то, что относится к фильтру zscale.
Вложения
Тип файла: zip bat файл.zip (6.4 Кб, 1 просмотров)

Последний раз редактировалось Жрец Нефтиды; 20.01.2021 в 19:19.
Жрец Нефтиды вне форума   Ответить с цитированием Вверх
Старый 13.01.2021, 20:32   #3
Жрец Нефтиды
Модератор
 
Аватар для Жрец Нефтиды
 
Регистрация: 15.07.2012
Адрес: Санкт-Петербург
Сообщений: 1,301
Сказал(а) спасибо: 340
Поблагодарили 519 раз(а) в 353 сообщениях
Вес репутации: 494
Жрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond repute
По умолчанию

Почему-то в прошлом посту npl=100 получилось с пробелом, а должна быть просто сотня, видимо, особенности устройства сайта, пока не знаю, как исправить.
Прикреплённый bat-файл точно правильный, используй его.
Жрец Нефтиды вне форума   Ответить с цитированием Вверх
Старый 13.01.2021, 21:26   #4
aleks_nsk
Модератор
 
Регистрация: 05.07.2010
Возраст: 53
Сообщений: 2,335
Сказал(а) спасибо: 721
Поблагодарили 1,008 раз(а) в 648 сообщениях
Вес репутации: 719
aleks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond reputealeks_nsk has a reputation beyond repute
По умолчанию

Ты зачем людей пугаешь? назови хоть одну бюджетную камеру, которая снимает в этом формате
aleks_nsk вне форума   Ответить с цитированием Вверх
Старый 13.01.2021, 21:47   #5
Жрец Нефтиды
Модератор
 
Аватар для Жрец Нефтиды
 
Регистрация: 15.07.2012
Адрес: Санкт-Петербург
Сообщений: 1,301
Сказал(а) спасибо: 340
Поблагодарили 519 раз(а) в 353 сообщениях
Вес репутации: 494
Жрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond repute
По умолчанию

Файлы и фильмы в таком формате уже стали появляться. Я не говорю, что их много, пока что единицы. Но лучше заранее быть готовым к их конвертированию в нечто привычное.
Например, появился "Спартак" 60-го года в вышеуказанном формате с большим количеством переводов от разных студий, весит под 100 гигов, разрешение 3840x2160. Мой древнеегипетский процессор не успевает декодировать такую махину в реальном времени, да и разрешение 3840x2160 для монитора 1920x1080 ни к чему. После конвертации получил фильм с семью разными переводами, включая дубляж. Этот конвертант, имхо-визуально, смотрится лучше, чем HD с одним закадровым переводом.
Что-то мне подсказывает, что фильмов в таком формате будет становиться всё больше.

Последний раз редактировалось Жрец Нефтиды; 14.01.2021 в 09:39.
Жрец Нефтиды вне форума   Ответить с цитированием Вверх
Старый 14.01.2021, 16:36   #6
Жрец Нефтиды
Модератор
 
Аватар для Жрец Нефтиды
 
Регистрация: 15.07.2012
Адрес: Санкт-Петербург
Сообщений: 1,301
Сказал(а) спасибо: 340
Поблагодарили 519 раз(а) в 353 сообщениях
Вес репутации: 494
Жрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond reputeЖрец Нефтиды has a reputation beyond repute
По умолчанию

Кодирование.
-codec:v libx264 Кодировать видео будем в h264 при помощи libx264
-x264-params Эта команда указывает, что сейчас мы зададим опции кодирования в h264. Опции пишутся в любой последовательности, одна опция от другой отделяется двоеточием.
Обрати внимание, что мы не используем пресеты, а сами, осознанно, задаём все опции.
qp=18 Кодирование всех кадров на постоянном квантизёре. 18 – это такое значение квантизёра, при котором найти различия между подаваемым и закодированным изображением можно при покадровом просмотре, рассматривая монитор через лупу. Если нужно получить видео вообще без потерь, то qp=0
Остальные опции описаны в теме сравнения h264 и XViD. Чтобы не грузиться чтением, их суть: мы полностью отключаем психовизуальную обработку и все другие виды обработок, которые хоть как-то упрощают изображение в угоду уменьшения конечного объёма. Мой незыблемый постулат – все детали, которые есть в исходнике, включая самые мелкие и незначительные, непременно должны быть и в конвертанте. Компьютерная программа не может решать за Человека, что для него важно, а что нет.
При таких опциях объём конечного файла будет большим и непредсказуемым. Это даже хорошо: тебя, возможно, будут встречать музыкой и аплодисментами в компьютерных магазинах, приторговывающих внешними USB-дисками.
:colorprim=bt709:transfer=bt709:colormatrix=bt709 Записать в заголовке конечного файла информацию об основных цветах, трансфере и коэффициентах матрицы. Даная информация может потребоваться плееру для правильного воспроизведения. На собственно кодирование эти опции не влияют. Если мы посмотрим через Медиаинфо на файл фильма классического блюрея, то увидим, что там эта информация есть. Пусть и у нас будет.
Обычно кодер h264 сам задаёт нужный уровень. Но мы его можем увеличить, добавив ещё одну опцию. Например: level=4.1
01.mkv Выходной файл. Любители монтажа могут заменить .mkv на mp4, качество видео от этого не изменится.
Запускаем батник. Если ты всё сделал правильно, то в сообщениях, выводимых батником, не должно быть текста красного или жёлтого цвета. Текст бирюзового цвета будет, это нормально.
Конвертация продлится долго или очень долго. Для длинного фильма это могут быть сутки и даже более. Зато качество будет отличным без всякого "или".
Во время этой геркулесовой работы рекомендую запустить бесплатный индикатор CPUID HWMonitor или Core Temp, и периодически посматривать на температуру процессора.
Конвертирование закончилось. При помощи матрёшечника присоединяем одну или несколько звуковых дорожек.
Если тебе непременно нужен контейнер mp4, то делаем так. Собранную матрёшку открываем в XMedia Recode, и перекидываем без пережатия в контейнер mp4, там есть такой формат MP4 (stream copy). XMedia Recode можно заменить Авидемюксом.
Вроде всё.

Последний раз редактировалось Жрец Нефтиды; 19.01.2021 в 22:38.
Жрец Нефтиды вне форума   Ответить с цитированием Вверх
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Full color range (0-255) при экспорте (HEVC или 264) NikVladi Adobe Premiere / Adobe Premiere PRO 4 20.03.2020 14:52
При экспорте в hevc изменяется соотношение сторон кадра kolokol Adobe Premiere / Adobe Premiere PRO 0 07.09.2018 01:30
Ставим H.265 (HEVC) на Edius 7 Денис В Canopus Edius 11 04.03.2018 00:20
кто уже пользуется H265? Максим87 Кодеки и кодеры, кодирование и конвертация. 73 07.02.2016 16:04
Конвертация SCR в AVI McAm Кодеки и кодеры, кодирование и конвертация. 0 25.02.2011 18:57


Часовой пояс GMT +1, время: 14:39.




Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot


Рейтинг@Mail.ru