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
- Выходной файл: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- Время кодирования: 142 мин 30 с
- Размер файла на диске: 51,2 МБ
Пример 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
- Выходной файл: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- Время кодирования: 213 мин 32 с
- Размер файла на диске: 161 МБ
Пример 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
- Выходной файл: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Время кодирования: 113 мин 9 с
- Размер файла на диске: 160 МБ
Конвертируйте 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
- Выходной файл: SDR_strobe_scientist_18Mbps-static.webm
- Время кодирования: 124 мин 23 с
- Размер файла на диске: 165 МБ
Преобразование 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
- Выходной файл: HLG_HDR_strobe_scientist_18Mbps-static.webm
- Время кодирования: 186 мин 10 с
- Размер файла на диске: 165 МБ
Краткое содержание
Размер выходных файлов разный. Входной файл весил 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 секунды.