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
- Arquivo de saída: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- Tempo de codificação: 142 m30s
- Tamanho do arquivo no disco: 51,2 MB
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
- Arquivo de saída: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- Tempo de codificação: 213 m32
- Tamanho do arquivo no disco: 161 MB
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
- Arquivo de saída: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Tempo de codificação: 113 m9
- Tamanho do arquivo no disco: 160 MB
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
- Arquivo de saída: SDR_strobe_scientist_18Mbps-static.webm
- Tempo de codificação: 124 m23
- Tamanho do arquivo no disco: 165 MB
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
- Arquivo de saída: HLG_HDR_strobe_scientist_18Mbps-static.webm
- Tempo de codificação: 186 m10
- Tamanho do arquivo no disco: 165 MB
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.