HDR-кодирование VP9

Видео с высоким динамическим диапазоном (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 2 и выводить сигнал на HDR-дисплей.

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

Настройки командной строки FFmpeg для включения профиля VP9 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 Устанавливает 10-битный формат пикселей YUV 4:2:0
-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/full/pc)
-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 CPU @ 3.20GHz
  • Память (ОЗУ): 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-Pass 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 Мбит/с 1080 масштабированный HDR 160 МБ 113м
С 18 Мбит/с HDR в SDR без масштабирования 165 МБ 124м
Д Преобразование HLG 18 Мбит/с 165 МБ 168м

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

Инструменты, необходимые для передачи 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 секунды.