Finalidade

Esta seção fornece recomendações para configurações de codificação VP9 ao realizar a codificação baseada em arquivos (ou seja, não ao vivo).

Essas recomendações foram criadas para as seguintes metas:

  • Um equilíbrio entre qualidade e velocidade de codificação
  • A taxa de bits mínima para alcançar uma qualidade razoável
  • Configurações para acomodar uma ampla variedade de tipos de conteúdo

Essas recomendações não:

  • Abordar a codificação ao vivo
  • Otimizar para tipos de conteúdo específicos (por exemplo, filmagens de esportes com muito movimento)
  • Configurar as definições para requisitos específicos de dispositivo ou rede

Codificação de resolução única

O VP9 é compatível com vários tamanhos de frame, desde resoluções pequenas até 4K. Tamanhos de frame maiores oferecem qualidade mais alta, mas exigem mais largura de banda para entrega e mais poder de processamento para decodificação.

Se você estiver criando uma única resolução, 640 x 480 é uma opção segura para uma ampla variedade de dispositivos móveis e da Web. Os parâmetros de linha de comando do FFmpeg a seguir permitem criar um arquivo de resolução única a 750 kbps.

-vf scale=640x480 -b:v 750k -quality good -speed 0 -crf 33 \
  -c:v libvpx-vp9 -c:a libopus output.webm

Codificação de várias resoluções

Se você planeja segmentar várias resoluções ou se sua rede de entrega tem largura de banda variável, é recomendável criar várias resoluções. O player pode controlar qual resolução está sendo enviada ao espectador.

As codificações de vídeo com várias resoluções são usadas com frequência na transmissão adaptativa de taxa de bits, em que o player de vídeo alterna entre resoluções em tempo real com base na largura de banda do usuário. Por exemplo, o Shaka Player permite reproduzir codificações de várias resoluções, em que cada codificação VP9 está em um arquivo separado e um manifesto DASH fornece informações sobre cada codificação.

Para mais informações sobre como empacotar vídeos em formatos de streaming adaptável, consulte o Shaka Packager. Este guia vai se concentrar nas configurações de codificação para VP9 em várias resoluções.

Todas as configurações abaixo podem ser usadas para arquivos individuais em várias resoluções. Combinadas, elas oferecem um conjunto abrangente adequado para streaming adaptável. A versão 640x480 tem duas versões, uma de baixa qualidade (LQ) e outra de qualidade média (MQ).

Taxa de bits

O modo de qualidade restrita (CQ) é recomendado ao codificar arquivos VP9 para visualização sob demanda. Esse modo de codificação permite especificar uma taxa de bits média de destino, controlando a qualidade máxima do vídeo e a taxa de bits mínima e máxima.

As taxas de bits a seguir são sugeridas como valores de referência para distribuição na Web e em dispositivos móveis. Essas sugestões minimizam a taxa de bits, alcançando uma qualidade de vídeo adequada para distribuição na Web e em dispositivos móveis. Pense nelas como uma recomendação de taxa de bits "baixa" que ainda pode alcançar uma qualidade razoável.

Para os exemplos acima, recomendamos que a taxa de bits mínima seja definida em 50% da taxa de bits desejada e a máxima em 145% da desejada.

Tamanho do frame/frame rate Taxa de bits de destino (VOD, kbps) Taxa de bits mínima (50%) Taxa de bits máxima (145%)
320x240p a 24,25,30 150 75 218
640 x 360p a 24,25,30 276 138 400
640x480p a 24,25,30 512 (LQ), 750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280x720p a 24,25,30 1024 512 1485
1280x720p a 50,60 1800 900 2610
1920x1080p a 24,25,30 1800 900 2610
1920 x 1080p a 50,60 3000 1500 4350
2560x1440p a 24,25,30 6000 3000 8700
2560x1440p a 50,60 9000 4500 13050
3840x2160p a 24,25,30 12000 6000 17400
3840x2160p a 50,60 18000 9000 26100

Figura 2a: taxas de bits de VOD recomendadas

No FFmpeg, a taxa de bits é controlada com os seguintes comandos:

FFmpeg
-b:v <arg> Define a taxa de bits (por exemplo, 500k)
-minrate <arg>
-maxrate <arg>
Define a taxa de bits mínima e máxima.

Por exemplo, ao codificar conteúdo de 640x480, use a linha de comando -b:v 750k -minrate 375 -maxrate 1088.

Qualidade

No modo CQ, você também define o nível máximo de qualidade. Os seguintes níveis de qualidade são recomendados para a codificação VP9 baseada em arquivos:

Altura do frame Qualidade desejada (CQ)
240 37
360 36
480 34 (LQ) ou 33 (MQ)
720 32
1080 31
1440 24
2160 15

No FFmpeg, a qualidade é definida com o comando -crf. Por exemplo, para definir a qualidade como 33, use o comando -crf 33

Codificação multipassagem e velocidade de codificação

A codificação baseada em arquivos oferece flexibilidade na velocidade. Você também pode fazer várias passagens no mesmo material para aumentar a qualidade e escolher velocidades para cada uma.

Ao codificar arquivos VP9 no FFmpeg, é recomendável definir o parâmetro -quality como good e, em seguida, definir a velocidade da primeira e da segunda transmissão de acordo com a tabela abaixo com o parâmetro -speed. Isso oferece um bom equilíbrio entre o tempo de codificação e a qualidade da saída.

Altura do frame Velocidade (primeira passagem) Velocidade (segunda passagem)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

Por exemplo, uma string de codificação de primeira transmissão no FFmpeg pode incluir -quality good -speed 4.

Espaçamento de frames-chave

Recomendamos permitir até 240 frames de vídeo entre os quadros-chave (8 segundos para conteúdo de 30 fps). Os quadros-chave são autossuficientes. Eles não dependem de outros quadros para serem renderizados, mas tendem a ser maiores do que outros tipos de quadros. Para reprodução na Web e em dispositivos móveis, um espaçamento generoso entre os frames-chave permite que o codificador escolha o melhor posicionamento para maximizar a qualidade.

No FFmpeg, o espaçamento dos frames-chave é controlado com o comando -g, que indica o número de frames. Para 240 frames, seria -g 240.

Recomendações de mosaico e threading

O mosaico divide o frame do vídeo em várias colunas, o que reduz um pouco a qualidade, mas acelera o desempenho da codificação. Os blocos precisam ter pelo menos 256 pixels de largura, então há um limite para quantos podem ser usados.

Dependendo do número de blocos e da resolução do frame de saída, mais linhas de execução da CPU podem ser úteis. Em geral, há pouco valor em várias linhas de execução quando o tamanho do frame de saída é muito pequeno.

As configurações a seguir são recomendadas para mosaicos e linhas de execução em várias resoluções.

Tamanho do frame Número de colunas de blocos Número de threads
320x240 1 (-tile-columns 0) 1
640 x 360 2 (-tile-columns 1) 2
640 x 480 2 (-tile-columns 1) 2
1280 x 720 4 (-tile-columns 2) 4
1920 x 1080 4 (-tile-columns 2) 4
2560x1440 8 (-tile-columns 3) 8
3840 x 2160 8 (-tile-columns 3) 8

No FFmpeg, o número de blocos é controlado com o parâmetro -tile-columns e o número de linhas de execução com -threads. Por exemplo, uma codificação de 640x480 usaria a linha de comando -tile-columns 1 -threads 2.

Linhas de comando do FFmpeg

Reunindo as recomendações acima, os seguintes comandos do FFmpeg podem ser usados para codificar conteúdo VP9.

Os comandos de primeira e segunda passagem são encadeados. O argumento -y no comando de segunda passagem responde "Sim" quando o FFmpeg pede para substituir o arquivo de estatísticas da primeira passagem pelo vídeo de saída.

Uma fonte de 1080p é usada para codificações destinadas a uma saída de até 1280x720. Uma fonte 4K é usada para saídas maiores.

320 x 240 (24, 25 ou 30 quadros por segundo)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-320x240.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 1 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-320x240.webm

640 x 360 (24, 25 ou 30 quadros por segundo)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x360.webm

640 x 480 (baixa qualidade, 24, 25 ou 30 quadros por segundo)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-low.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-low.webm

640 x 480 (qualidade média, 24, 25 ou 30 quadros por segundo)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-medium.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-640x480-medium.webm

1280x720 (24, 25 ou 30 quadros por segundo)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-24-30fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1280x720-24-30fps.webm

1280x720 (50 ou 60 quadros por segundo)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-50-60fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2-y tos-1280x720-50-60fps.webm

1920x1080 (24, 25 ou 30 quadros por segundo)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-24-30fps.webm

1920 x 1080 (50 ou 60 quadros por segundo)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 2 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 3 -g 240 -threads 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-1920x1080-50-60fps.webm

2560 x 1440 (24, 25 ou 30 quadros por segundo)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-24-30fps.webm

2.560 x 1.440 (50 ou 60 quadros por segundo)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-2560x1440-50-60fps.webm

3840 x 2160 (24, 25 ou 30 quadros por segundo)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -y tos-3840x2160-24-30fps.webm

3840 x 2160 (50 ou 60 quadros por segundo)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 8 \
  -quality good -speed 2 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm