Codificação VP9 HDR

O vídeo High Dynamic Range (HDR) é uma tecnologia de maturidade. Atualmente, existem diversos padrões de harmonização gradual.

Para manter uma imagem atualizada da evolução do vídeo em HDR, consulte o artigo da WikiPedia Vídeo em alto alcance dinâmico (em inglês).

O FFmpeg pode ser usado com o VP9 para (1) compactar origens HDR em saídas de Intervalo dinâmico padrão (SDR, na sigla em inglês) ou (2) para reempacotar uma origem HDR em formatos compatíveis com a Web em HDR.

Origens de entrada

No momento, ao codificar HDR com VP9, todos os codecs de profundidade de bits alta (10 bits) compatíveis com FFmpeg podem ser usados como entrada (por exemplo, VP9 Profile 2 e 3, H.264 (10 bits), DNxHR, HEVC, ProRes etc.). Consulte também o artigo de suporte do YouTube Enviar vídeos em High Dynamic Range (HDR).

Alcance de saída codificado:

Atualmente e em geral, os dispositivos de destino compatíveis incluem qualquer dispositivo que possa decodificar o VP9 Profile 2 e gerar uma saída para uma tela HDR.

  • Chromecast Ultra + TV compatível com HDR
  • Chrome 64 Canary no Windows 10 Fall Creators Update com a sinalização HDR ativada. Essa é uma boa ferramenta de depuração.
  • Qualquer TV HDR com o perfil 2 do VP9
    • Todos os modelos HDR de 2017 da Samsung (lista flatpanelshd.com) e modelos de 2016 que começam com "KS"
    • Todos os modelos LG 2017 HDR (também alguns modelos LG G6 2016)
    • Em dispositivos móveis, compatíveis com o VP9 29 Perfil 2 com aceleração de hardware (Meizu Pro 7)
    • Bluray em UHD de 2017

Configurações de linha de comando FFmpeg para ativar o VP9 Profile 2 e as EOTFs HDR

Seu FFmpeg precisará ser criado com suporte para 10 bits (ou mesmo 12 bits).

Nos exemplos abaixo, usamos um ffmpeg criado estaticamente com suporte para 10 bits. Use nosso script de criação para criar seu próprio ou siga as orientações do site do FFmpeg.

Veja a seguir uma linha de comando FFmpeg utilizável para a codificação HDR para os padrões SMPTE 2084 (PQ EOTF) com 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

Detalhamento dos principais parâmetros apresentados aqui:

ffmpeg O build estático com suporte para 10 bits
-pass 1 O HDR exige codificação de duas passagens. Neste exemplo, a primeira passagem é gerada para /dev/null e processada na memória durante a segunda passagem.
-pix_fmt yuv420p10le Define o formato YUV 4:2:0 de 10 bits
-color_primaries 9 Define BT2020. Consulte as páginas 5 e 6 deste documento para ver mais detalhes.
-color_trc 16 16 define características de transferência como SMPTE 2084. A PQ 18 define as características de transferência SMPTE 2086 HLG
-colorspace 9 colorspace é o método de matriz Isso precisa ser definido de acordo com a forma como o conteúdo foi masterizado. (por exemplo, bt709, bt2020_ncl). Nesse exemplo, ele precisa ser 9 para bt2020_ncl. Para mais referências, veja a página 12 deste documento.
-color_range 1 Intervalo de cores (0 = não especificado, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 Para HDR, é necessário ter um perfil ou 2 ou 3.
-vcodec libvpx-vp9 Use o codificador VP9.

Codificações de exemplo

Todos os exemplos a seguir usam o arquivo de origem strobe_scientist.mkv.

Como uma observação geral sobre taxas de bits com codificação HDR, é recomendada uma taxa de bits de 25% a 30% maior do que a codificação SDR de 8 bits equivalente. Os exemplos costumam ter 18 Mbps. Bons resultados em HDR podem ser alcançados com taxas de bits de 12 Mbps com ajuste ideal.

As codificaçãos foram realizadas em um sistema Ubuntu Linux com as seguintes especificações:

  • Processador: CPU 4x Intel(R) Core(TM) i5-6500 de 3,20 GHz
  • Memória (RAM): 8.060 MB (1.492 MB usados)
  • Gráficos: Intel HD Graphics 530 (PageSpeed GT2)
  • SO: Ubuntu 16.04 LTS

Converter para YUV 4:2:0 de 10 bits PQ

Exemplo A: passagem de 4 Mbps 4K
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
Exemplo B1: 18 Mbps 4k 2-pass
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
Exemplo B2: 18 Mbps 1080p 2-pass
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

Converter HDR em SDR com uma tabela de pesquisa (LUT)

A conversão de HDR em SDR exige que o transcodificador entenda como mapear os níveis e as cores de brilho para o espaço de cores BT.709 menor e o intervalo de brilho não HDR. Para melhores resultados, é possível usar uma LUT que descreve como executar esse mapeamento, geralmente específico para o conteúdo. Os exemplos de C e D mostram como usar uma LUT. Usamos bt2020_to_bt709_example.cube.

Exemplo C: HDR de 4Kbps 4K para SDR com 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

Converter HLG para VP9 HLG10 de 10 bits PQ

Requer uma fonte HLG. Usamos o arquivo de entrada strobe_scientist_hlg.mkv.

Exemplo D: HLG de 18 Mbps com 2 passes
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

Resumo

Os arquivos de saída são de tamanhos variados. A entrada foi de 4,3 GB.

Exemplo Saída desejada Tamanho em disco Tempo de codificação
A HDR de 6 Mbps 4K sem escala 51,2 MB 142m
B1 HDR sem escala de 18 Mbps 4K 161MB 213m
B2 HDR de 18 Mbps a 1.080 160MB 113m
C HDR de 18 Mbps para SDR 165MB 124m
D Conversão HLG de 18 Mbps 165MB 168m

A codificação de passagem 2 é recomendada para HDR, já que 1 passagem pode variar em determinadas configurações.

Ferramentas necessárias para sinalizar HDR na saída WebM e MP4 (ferramentas de linha de comando do Matroska)

No momento da gravação, o FFmpeg não fornece um mecanismo para especificar metadados estáticos SMPTE 2086 em WebM/MKV, embora ele seja propagado de um stream de entrada quando ele o contém.

A ferramenta mkvmerge, parte de mkvtoolnix, pode ser usada para inserir ou modificar esses metadados se o aplicativo exigir.

Veja a seguir um exemplo de como inserir metadados HDR em um dos arquivos criados acima. Ela é adequada principalmente para preparar conteúdo HDR para o envio ao 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

Este exemplo produz o arquivo HDR_strobe_scientist_18Mbps.mkv, em 0,6 segundo.