Objetivo

Esta seção fornece recomendações para configurações de codificação VP9 ao executar uma codificação baseada em arquivos (ou seja, ela não está ativa).

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

  • 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 grande variedade de tipos de conteúdo

Estas recomendações não:

  • Codificação em tempo real de endereços
  • Otimizar para tipos de conteúdo específicos (por exemplo, imagens de esportes de alto movimento)
  • Definir configurações para requisitos específicos de dispositivos ou de 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 proporcionam maior qualidade, mas exigem mais largura de banda para serem entregues e mais capacidade de processamento para decodificar.

Se você está criando uma única resolução, o ideal é usar 640 x 480 em uma grande variedade de dispositivos da Web e de dispositivos móveis. Os seguintes parâmetros de linha de comando FFmpeg permitem criar um arquivo de resolução única em 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 para multiresolução

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. Assim, o player pode controlar a resolução que será enviada ao visualizador.

Codificações de vídeo com várias resoluções geralmente são usadas em streaming de taxa de bits adaptável, 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 o empacotamento de vídeos em formatos de streaming adaptáveis, consulte o Shaka Packager. Este guia se concentrará nas configurações de codificação do VP9 em várias resoluções.

Todas as configurações abaixo podem ser usadas para arquivos individuais com várias resoluções, combinadas e fornecem um conjunto abrangente e adequado para streaming adaptável. Observe que a versão de 640 x 480 tem duas versões, uma de baixa qualidade (LQ) e a 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 que você especifique uma taxa de bits média desejada, 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, o que atinge a qualidade do vídeo adequada para a distribuição na Web para dispositivos móveis e para dispositivos móveis. Pense nelas como uma recomendação de taxa de bits 'baixa' que ainda pode atingir uma qualidade razoável.

Para os exemplos acima, é recomendado que a taxa de bits mínima seja definida como 50% da taxa de bits de destino e o máximo como 145%.

Tamanho do frame/Taxa de frame Taxa de bits desejada (VOD, kbps) Taxa de bits mínima (50%) Taxa máxima de bits (145%)
320 x 240 p 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)
1.280 x 720p a 24,25,30 1024 512 1485
1.280 x 720p a 50,60 1.800 900 2610
1.920 x 1.080p a 24,25,30 1.800 900 2610
1.920 x 1.080p a 50,60 3000 1.500 4350
2.560 x 1.440 p a 24,25,30 6.000 3000 8700
2.560 x 1.440 p a 50,60 9000 4500 13050
3.840 x 2.160p a 24,25,30 12.000 6.000 17400
3.840 x 2.160p 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, 500 mil)
-minrate <arg>
-maxrate <arg>
Define a taxa de bits mínima e máxima.

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

Qualidade

No modo CQ, você também definirá 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 para várias passagens e Velocidade de codificação

A codificação baseada em arquivos permite flexibilidade na velocidade. Também é possível executar vários cartões no mesmo material para aumentar a qualidade e escolher velocidades para cada um.

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

Altura do frame Velocidade (primeiro passe) Velocidade (segundo cartão)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

Por exemplo, uma primeira string de codificação de 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 frames-chave (8 segundos para conteúdo de 30 fps). Os frames-chave são frames de vídeo autossuficientes; eles não dependem de nenhum outro frame para renderizar, mas tendem a ser maiores que outros tipos de frames. Para reprodução na Web e em dispositivos móveis, o espaçamento generado entre os frames-chave permite que o codificador escolha o melhor posicionamento para frames-chave para maximizar a qualidade.

No FFmpeg, o espaçamento de frames-chave é controlado pelo comando -g, indicando o número de frames. Para 240 frames, seria -g 240.

Recomendações de vinculação e linha de execução

O compartilhamento 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. Portanto, há um limite na quantidade de blocos que 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. De modo geral, há um valor limitado para 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 agrupar e aplicar linhas de execução em diversas resoluções.

Tamanho do frame Número de colunas de bloco Número de linhas de execução
320x240 1 (-tile-columns 0) 2
640 x 360 2 (-tile-columns 1) 4
640 x 480 2 (-tile-columns 1) 4
1280 x 720 4 (-tile-columns 2) 8
1920 x 1080 4 (-tile-columns 2) 8
2560x1440 8 (-tile-columns 3) 16
3840 x 2160 8 (-tile-columns 3) 16

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

Linhas de comando FFmpeg

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

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

Observe também que uma fonte de 1080p é usada para codificações de saída de até 1280x720. Uma origem 4k é usada para uma saída maior.

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 2 \
  -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 2 \
  -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 4 \
  -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 4 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x360.webm

640x480 (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 4 \
  -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 4 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x480-low.webm

640x480 (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 4 \
  -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 4 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x480-medium.webm

1.280 x 720 (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 8 \
  -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 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1280x720-24-30fps.webm

1.280 x 720 (50 ou 60 frames 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 8 \
  -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 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4-y tos-1280x720-50-60fps.webm

1.920 x 1.080 (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 8 \
  -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 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1920x1080-24-30fps.webm

1.920 x 1.080 (50 ou 60 frames por segundo)

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

2.560 x 1.440 (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 16 \
  -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 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -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 16 \
  -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 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-2560x1440-50-60fps.webm

3.840 x 2.160 (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 24 \
  -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 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-3840x2160-24-30fps.webm

3.840 x 2.160 (50 ou 60 frames por segundo)

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