Кодирование 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
- Выходной файл: 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 прохода, 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 Мбит/с, 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 секунды.