Кодирование VP9 HDR

Видео с расширенным динамическим диапазоном (HDR) — это развивающаяся технология. Сегодня существует ряд постепенно гармонизирующихся стандартов.

Сохраняющуюся картину развития HDR-видео см. в статье Википедии «Видео с высоким динамическим диапазоном ».

FFmpeg можно использовать вместе с VP9 как для (1) сжатия источников HDR в выходные данные стандартного динамического диапазона (SDR), так и (2) для переупаковки источника HDR в веб-форматы HDR.

Источники ввода

В настоящее время при кодировании HDR с помощью VP9 в качестве входных данных могут использоваться любые кодеки с высокой разрядностью (10 бит), поддерживаемые FFmpeg (например, VP9 Profile 2 и 3, H.264 (10 бит), DNxHR, HEVC, ProRes). , и другие.). См. также статью службы поддержки YouTube Загрузка видео с расширенным динамическим диапазоном (HDR) .

Закодированный выходной охват:

В настоящее время и в целом поддерживаемые целевые устройства включают в себя любое устройство, которое может декодировать VP9 Profile 2 и выводить на дисплей HDR.

  • Chromecast Ultra + телевизор с поддержкой HDR
  • Chrome 64 Canary в Windows 10 Fall Creators Update с включенным флагом HDR. (Это хороший инструмент отладки).
  • Любой HDR-телевизор с профилем VP9 2
    • Все модели Samsung 2017 года HDR ( список flatpanelshd.com ) и модели 2016 года, начинающиеся с «KS».
    • Все модели LG 2017 года HDR (также некоторые модели LG G6 2016 года)
    • На мобильных устройствах, которые поддерживают 10-битное декодирование HDR VP9 Profile 2 с аппаратным ускорением ( Meizu Pro 7 )
    • UHD Blu-ray 2017 года

Настройки командной строки FFmpeg для включения VP9 Profile 2 и HDR EOTF

Ваш FFmpeg должен быть построен с поддержкой 10-битной (или даже 12-битной) версии.

В примерах ниже мы используем статически собранный ffmpeg с поддержкой 10-бит. Вы можете использовать наш скрипт сборки, чтобы создать свой собственный, или следовать инструкциям на сайте FFmpeg .

Ниже приведена полезная командная строка FFmpeg для кодирования HDR в соответствии со стандартами SMPTE 2084 (PQ EOTF) с VP9:

ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 /dev/null && \
   ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 2 \
   -pix_fmt yuv420p10le \
   -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
   -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 \
   strobe_scientist_18Mbps.webm

Разбивка ключевых параметров, представленных здесь:

ffmpeg Статическая сборка с поддержкой 10-бит.
-pass 1 HDR требует двухпроходного кодирования. В этом примере первый проход выводится в /dev/null и обрабатывается в памяти во время второго прохода.
-pix_fmt yuv420p10le Устанавливает YUV 4:2:0 10-битный формат пикселей
-color_primaries 9 Наборы BT2020 Более подробную информацию см. на стр. 5 и 6 данного документа.
-color_trc 16 16 наборов передаточных характеристик для SMPTE 2084. PQ 18 наборов передаточных характеристик для SMPTE 2086 HLG
-colorspace 9 colorspace — это «matrix_coefficients». Это должно быть установлено в соответствии с тем, как контент был освоен. (например, bt709, bt2020_ncl). В этом примере для bt2020_ncl должно быть 9 . Для получения дополнительной информации см. стр. 12 этого документа.
-color_range 1 Цветовой диапазон ( 0 = не указан, 1 = mpeg/studio/tv, 2 = jpeg/полный/ПК)
-profile:v 2 Для HDR требуется профиль или 2 или 3 .
-vcodec libvpx-vp9 Используйте кодер VP9.

Пример кодирует

Во всех следующих примерах используется исходный файл strobe_scientist.mkv.

В качестве общего замечания по битрейту при кодировании HDR рекомендуется битрейт на 25-30% выше, чем при эквивалентном 8-битном кодировании SDR. Примеры обычно нацелены на скорость 18 Мбит/с. Хороших результатов HDR можно добиться с битрейтом 12 Мбит/с с оптимальной настройкой.

Кодирование выполнялось в системе Ubuntu Linux со следующими характеристиками:

  • Процессор: 4x Intel(R) Core(TM) i5-6500 с тактовой частотой 3,20 ГГц
  • Память (ОЗУ): 8060 МБ (используется 1492 МБ)
  • Графика: Intel HD Graphics 530 (Skylake GT2)
  • ОС: Ubuntu 16.04 LTS

Преобразовать в YUV 4:2:0 10-бит PQ

Пример A: 6 Мбит/с, 4k, 2 прохода
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_6Mbps-static.webm
Пример B1: 18 Мбит/с, 4k, 2 прохода
ffmpeg -y -report -i strobe_scientist.mkv -b:v **18000000** -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_18Mbps-static.webm
Пример B2: 18 Мбит/с, 1080p, 2 прохода
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  1080_2pass_HDR_strobe_scientist_18Mbps-static.webm

Преобразование HDR в SDR с помощью справочной таблицы (LUT)

Преобразование HDR в SDR требует, чтобы транскодер понимал, как сопоставлять уровни яркости и цвета с меньшим цветовым пространством BT.709 и диапазоном яркости без HDR. Для достижения наилучших результатов можно использовать LUT, описывающий, как выполнить это сопоставление, обычно специфичное для контента. Примеры C и D показывают, как использовать LUT. Мы использовали bt2020_to_bt709_example.cube

Пример C: 18 Мбит/с 4k HDR в SDR с LUT
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm SDR_strobe_scientist_18Mbps-static.webm

Преобразование HLG в VP9 HLG10 10-битный PQ

Требуется источник HLG. Мы использовали входной файл strobe_scientist_hlg.mkv

Пример D: 18 Мбит/с, 4k, 2 прохода, HLG
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 1 -speed 4 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  HLG_HDR_strobe_scientist_18Mbps-static.webm

Резюме

Выходные файлы имеют разный размер. Ввод был 4,3 ГБ.

Пример Целевой результат Размер на диске Кодировать время
А 6 Мбит/с 4k HDR без масштабирования 51,2 МБ 142м
Б1 18 Мбит/с 4k HDR без масштабирования 161 МБ 213м
Би 2 18 Мбит/с, HDR, масштабирование 1080 160 МБ 113м
С 18 Мбит/с HDR в SDR без масштабирования 165 МБ 124м
Д Преобразование 18 Мбит/с HLG 165 МБ 168м

Обратите внимание, что для HDR рекомендуется 2-проходное кодирование, поскольку 1-проходное кодирование может различаться в некоторых конфигурациях.

Инструменты, необходимые для сигнализации HDR в выводе WebM и MP4 (инструменты командной строки Matroska)

На момент написания FFmpeg не предоставлял механизма для указания статических метаданных SMPTE 2086 в WebM/MKV, хотя он будет распространять их из входного потока, когда поток их содержит.

Инструмент mkvmerge , входящий в состав mkvtoolnix , можно использовать для вставки или изменения этих метаданных, если это требуется вашему приложению.

Ниже приведен пример вставки метаданных HDR в один из файлов, созданных выше. Он особенно подходит для подготовки HDR-контента к загрузке на YouTube .

mkvmerge \
  -o HDR_strobe_scientist_18Mbps.mkv\
  --colour-matrix 0:9 \
  --colour-range 0:1 \
  --colour-transfer-characteristics 0:16 \
  --colour-primaries 0:9 \
  --max-content-light 0:1000 \
  --max-frame-light 0:300 \
  --max-luminance 0:1000 \
  --min-luminance 0:0.01 \
  --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 \
  --white-colour-coordinates 0:0.3127,0.3290 \
  HDR_strobe_scientist_18Mbps.webm

В этом примере создается файл HDR_strobe_scientist_18Mbps.mkv за 0,6 секунды.