Modos de taxa de bits do VP9 em detalhes

Introdução

Damos mais detalhes sobre os modos de taxa de bits nas nossas páginas de Codificação básica, mas eles abordam apenas o modo CQ (Qualidade restrita ).

Este documento detalha outras maneiras práticas de personalizar as taxas de bits do VP9 para otimizar em vários cenários. Os exemplos abaixo usam FFmpeg.

Compactação

O objetivo das tecnologias de compactação de vídeo, como o VP9, é reduzir a quantidade de dados necessários para transmitir uma imagem inteligente e uma sensação de movimento aos usuários finais.

Uma das técnicas principais usadas para conseguir isso é a quantização. Um quantizador simplifica matematicamente vários elementos digitalizados da imagem. Por exemplo, ele pode reduzir o intervalo de cores usadas e ainda executar funções matemáticas nos dados para "suavizar a saída; a falta percebida de resolução precisa dentro do intervalo de cores reduzido. Existem muitas dessas funções.

A quantização (ou "quot;Q") é bem descrita no artigo da Wikipédia.

No VP9, a quantização é realizada nos coeficientes de transformação. Isso reduz a taxa de bits necessária para manter a qualidade percebida, aumentando a codificação.

Em última análise, quando há mais quantização (um número Q maior), os detalhes são perdidos e a qualidade é menor, mas menos dados são necessários para armazenar o frame. Na maioria dos casos, o codificador VP9 atinge as metas de taxa de bits alterando Q ao longo do tempo, dependendo da complexidade de cada frame.

Otimização do caso de uso

Para permitir que o usuário ajuste a compactação de VP9 para suas necessidades específicas, é possível ajustar o equilíbrio de qualidade e taxa de bits no momento da compactação inicial por meio de várias interfaces de programação.

O codificador tem uma compensação deslizante entre velocidade, qualidade e taxa de bits.

  • Se o foco de um usuário for na qualidade, ele precisará estar preparado para tempos de codificação mais longos ou para fornecer recursos de processamento mais rápidos e abundantes.

  • Se o foco de um usuário for garantir que o arquivo de saída codificado em VP9 seja pequeno e possa ser enviado rapidamente, ele precisará estar preparado para reduzir o tempo em que a imagem pode ser processada pelo quantificador, o que resultará em mais detalhes para que o quantificador funcione.

  • Se um usuário estiver totalmente focado na velocidade de entrega (por exemplo, em uma videoconferência on-line ao vivo ou em uma videoconferência bidirecional), a quantização poderá ser completamente subordinada às restrições da taxa em que bytes utilizáveis de dados podem ser transmitidos por uma rede (ou seja, "bitrate").

A escolha correta será altamente específica para cada caso de uso. Para simplificar o ajuste desse equilíbrio ao seu caso de uso, o VP9 é compatível com a configuração direta em quatro &modos de taxa de bits.

Modos de taxa de bits VP9

Vamos começar analisando os principais modos de taxa de bits compatíveis com o VP9:

Modo
Quantizer constante (Q) Permite especificar um valor de quantizador fixo. A taxa de bits varia
Qualidade restrita (CQ) Permite definir um nível de qualidade máximo. A qualidade pode variar de acordo com os parâmetros de taxa de bits
Taxa de bits variável (VBR) Equilibra a qualidade e a taxa de bits ao longo do tempo de acordo com as restrições na taxa de bits
Taxa de bits constante (CBR) Tenta manter a taxa de bits um pouco constante enquanto a qualidade varia.

Q

Gráfico do modo Q

O modo Quantizer constante é uma boa escolha para cenários em que as preocupações sobre o tamanho e a taxa de bits do arquivo estão completamente subordinadas à qualidade final.

Os casos de uso para configurações do Q podem ser encontrados em cinema digital, pacotes de edição digital ou aplicativos de sinalização digital, em que o conteúdo pode ser entregue em uma mídia de armazenamento física ou em um tempo sem restrições.

Otimização da taxa de bits do modo Q do VP9

O modo Quantizer constante requer configuração mínima. Como o nome sugere, o modo Q está focado em manter o quantizador em um nível desejado de qualidade e permitir que o quantizador determine o fluxo de dados que ele quer processar. Tudo o que o usuário precisa definir é a qualidade desejada.

Há mais informações sobre detalhes específicos da qualidade de destino de um foco de processamento de imagens (não de foco de taxa de bits) no artigo Codificação básica.

Use os seguintes parâmetros de linha de comando FFmpeg para otimização da taxa de bits do modo Q:

ffmpeg
-b:v 0 Ao marcar a taxa de bits de vídeo como 0, definimos explicitamente o modo Qquot;
-g <arg> Define o intervalo de frame-chave em frames (o padrão é 240).
-crf <arg> Define o nível de qualidade máximo. Os valores válidos são de 0 a 63. Números menores têm qualidade melhor
-quality good -speed 0 Padrão e recomendado para a maioria dos aplicativos. O best é uma ferramenta de pesquisa mais avançada, com melhorias temporárias em relação ao -quality good -speed 0.
-lossless Modo sem perdas

Taxa de bits do modo Q : exemplos de FFmpeg

O primeiro exemplo é uma configuração muito extrema do modo Q e é fornecida apenas para ilustração. Nesses casos, mesmo o processamento do clipe de 120 segundos levará várias horas, e o arquivo de saída produzido geralmente é muito maior do que a fonte original.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -g 1 -b:v 0 -crf 0 -quality good \
  -speed 0 -lossless 1 -c:a libvorbis Q_g_1_crf_0_120s_tears_of_steel_1080p.webm.webm

Para comparar o efeito de -crf, os exemplos a seguir variam apenas de -crf. Observe que -g não é definido. Portanto, o padrão é 240. Na prática, -crf é definido como 10 por padrão, então teremos o mesmo resultado sem incluir nenhum dos parâmetros no segundo dos três exemplos:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 0 -quality good \
  -speed 0 -c:a libvorbis Q_crf_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -c:a libvorbis Q_crf_10_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 63 -quality good \
  -speed 0 -c:a libvorbis Q_crf_63_120s_tears_of_steel_1080p.webm

A saída desses exemplos é diferente em tamanho no disco. Com -crf definido como 0, o arquivo foi de 711,8 MB, com -crf definido como 10, o tamanho do arquivo foi de 125,3 MB, e com -crf definido como 63 o arquivo foi de 4,5 MB. Em termos muito simples, isso destaca que reduzimos a qualidade do arquivo codificado VP9 resultante aumentando o valor do argumento -crf. Um resumo completo de todos os arquivos de saída está na tabela "Resultados" abaixo.

Agora vamos comparar o efeito da variação da configuração -g.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -g 1 -b:v 0 -quality good \
  -speed 0  -c:a libvorbis Q_g_1_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -g 240 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_240_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -g 480 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_480_120s_tears_of_steel_1080p.webm

Notamos que a configuração -g 1 produz um arquivo muito grande, com 25,9 MB. Compare isso com a mudança da -g 240, definindo explicitamente o mesmo que o padrão, em que temos um arquivo de 4,5 MB, e -g 480, em que temos um arquivo de 4,4 MB.

CQ

A CQ é um modo recomendado para vídeos baseados em arquivos.

Gráfico do modo CQ

Para a maioria dos tipos de conteúdo, recomendamos usar o modo de qualidade restrita (CQ), com limites de taxa de bits. A maioria dos vídeos contém uma mistura de cenas com muito movimento (por exemplo, sequências de ação) e cenas com menos detalhes (por exemplo, conversas). O modo CQ permite que o codificador mantenha um nível de qualidade razoável durante cenas mais longas e fáceis (sem desperdiçar bits), enquanto aloca mais bits para sequências difíceis.

No entanto, ainda precisamos restringir o processo fornecendo um intervalo superior. Caso contrário, talvez não haja compactação. Também podemos definir um intervalo mais baixo, em que, mesmo que a imagem seja preta e o processo de codificação tenha quase nenhuma capacidade, ainda assim reduziremos esses dados, talvez menos do que poderíamos, mas com o resultado final até mesmo que o preto não seja significativamente compactado e pareça muito quot;

Além disso, também precisamos definir o limite de quantizador. No VP9, o limite do quantizador pode variar de 0 a 63.

Os seguintes parâmetros de linha de comando FFmpeg são usados para o modo CQ:
ffmpeg
-b:v <arg> Define a taxa de bits desejada (por exemplo, 500 KB)
-minrate <arg>
-maxrate <arg>
Define a taxa de bits mínima e máxima.
-crf <arg> Define o nível de qualidade máximo. Os valores válidos são de 0 a 63, e os números mais baixos têm qualidade mais alta.
Modo de taxa de bits de CQ: exemplos de FFmpeg

O primeiro exemplo oferece uma restrição razoavelmente ampla. Em comparação com os exemplos fornecidos acima para Q, no entanto, descobrimos que isso força as taxas de bits em um intervalo maior e a qualidade de saída é notavelmente maior. O arquivo é muito maior.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1000k -maxrate 4000k -crf 10  -c:a libvorbis \
  CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm

O arquivo de saída nessa instância era de 20,2 MB no disco, visivelmente menor do que o código do modo Q nos exemplos acima.

Já no próximo exemplo, restringimos a taxa de bits a um intervalo muito mais definido.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10  -c:a libvorbis \
  CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm

Nesse caso, o tamanho do arquivo de saída foi de 24,1 MB e, em momentos de alta complexidade e movimento, a qualidade do vídeo é visivelmente reduzida em comparação com o exemplo anterior.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080pp.webm

Neste exemplo final, a saída foi reduzida significativamente, diminuindo para 13,2 MB em disco.

VBR

O modo de taxa de bits variável (VBR) é recomendado para streaming de arquivos de vídeo on demand de conteúdo com alto movimento (por exemplo, esportes). Ela é adequada para entregas baseadas em HTTP.

Gráfico do modo VBR

Em um modelo VBR, as cenas de ação podem ser codificadas com uma taxa de bits maior do que as cenas "mais fáceis, que são consistentes com o frame-chave.

Para modelos de entrega de streaming grandes, os benefícios da VBR aumentam significativamente em termos de distribuição e infraestrutura. Quando muitos streams de VBR estão sendo entregues pela mesma infraestrutura, isso pode oferecer benefícios a todos os espectadores que usam o sistema.

O VP9 VBR também é recomendado para codificar esportes e outros conteúdos com alto movimento. Para conteúdo de alta complexidade, a VBR atinge maior qualidade durante períodos de movimento mais baixo.

Os seguintes parâmetros de linha de comando FFmpeg são usados para o modo VBR:
ffmpeg
-quality good Se estiver presente, o FFmpeg considerará a configuração -speed subsequente
-speed <arg> Para VÍDEO ON DEMAND, os valores válidos são de 0 a 4, sendo 0 o mais baixo e 4 o mais baixo. Para transmissões ao vivo, o intervalo é de 5 a 8. Veja abaixo o CBR.
Modo de taxa de bits de VBR: exemplos de FFmpeg
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 0  -c:a libvorbis \
  VBR_good_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 8  -c:a libvorbis \
  VBR_good_8_120s_tears_of_steel_1080pp.webm

CBR

O modo de taxa de bits constante (CBR) é recomendado para transmissões ao vivo com VP9.

Gráfico em modo CBR

A CBR basicamente define a taxa de bits superior como um & Teto rígido. Isso significa que o processo de codificação não pode produzir dados a uma taxa que a rede não consiga carregar.

Por exemplo, para streams de comunicação em tempo real (videoconferências), é importante que o aplicativo de codificação não inunde a rede com mais dados do que consegue carregar. Se isso acontecer, problemas de sincronização de áudio/vídeo ou frames congelados afetarão significativamente a experiência do usuário, mais do que a eficiência de compactação reduzida. Ao garantir que o teto rígido seja definido, o VP9 reduzirá a qualidade à medida que esse teto for atingido.

Os seguintes parâmetros de linha de comando FFmpeg são usados para o modo CBR:
ffmpeg
-quality realtime Se estiver presente, o FFmpeg considerará a configuração -speed subsequente
-speed <arg> Para transmissões ao vivo, os valores válidos são de 5 a 8, sendo 5 a qualidade mais baixa e 8 a mais baixa. Para vídeos sob demanda, são de 0 a 4. Consulte VBR acima.
-minrate <arg>
-maxrate <arg>
Define a taxa de bits mínima e máxima ** Elas precisam ser definidas como o mesmo valor de taxa de bits -b:v para o modo CBR** .

Em termos muito simples, corrigimos as taxas de bits mínimas e mínimas para o mesmo valor e informamos ao quantizador que as operações são urgentes.

Modo de taxa de bits CBR: exemplos de FFmpeg

Os exemplos abaixo mostram como definir a taxa de bits para 2 Mbps e 500 kbps:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 0 -c:a libvorbis \
  CBR_2000_realtime_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 8 -c:a libvorbis \
  CBR_2000_realtime__8_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 0 -c:a libvorbis \
  CBR_500_realtime__0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_8_120s_tears_of_steel_1080p.webm

Resultados

Cada uma das codificaçãos acima foi realizada 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

O arquivo de origem em todos os casos foi um clipe de 1 minuto e 20 segundos (1:20) selecionado em Tears Of Steel.

Arquivo Codificar min Tamanho do arquivo em disco
Q_g_1_crf_0_120s_tears_of_steel_1080p.webm 81 1,06 GB
Q_crf_0_120s_tears_of_steel_1080p.webm 131 711,8 MB
Q_crf_10_120s_tears_of_steel_1080p.webm 118 125,3 MB
Q_crf_63_120s_tears_of_steel_1080p.webm 27 4,5 MB
Q_g_1_120s_tears_of_steel_1080p.webm 51 25,9 MB
Q_g_240_120s_tears_of_steel_1080p.webm 28 4,5 MB
Q_g_480_120s_tears_of_steel_1080p.webm 10 4,4 MB
CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm 11 20,2 MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24,1 MB
CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm 50 13,2 MB
VBR_good_0_120s_tears_of_steel_1080p.webm 3 23,4 MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23,9 MB
VBR_good_8_120s_tears_of_steel_1080p.webm (link em inglês) 1 23,9 MB
CBR_2000_realtime_speed_0_120s_tears_of_steel_1080p.webm 98 21MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 2 24,8 MB
CBR_2000_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 21MB
CBR_500_realtime_speed_0_120s_tears_of_steel_1080p.webm 73 6,2 MB
CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 8,5 MB
CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 7,1 MB

Percebemos que a definição de valores -speed acima de 5 transforma a velocidade de processamento do VP9. Embora esse seja um aumento considerável na quantização (visto pelo efeito altamente citado em taxas de bits rápidas e de baixa qualidade), o VP9 ainda consegue produzir uma saída de 1080p com taxa de bits muito baixa, embora seja mais adequada para dispositivos móveis menores do que telas maiores.

Considerações sobre casos de uso com redimensionamento (redimensionamento)

Os modos de taxa de bits do VP9 são obviamente não isolados e podem ser combinados com muitos outros argumentos e parâmetros para segmentar especificamente casos de uso. Um caso de uso típico pode ser redimensionar as dimensões do vídeo de saída para segmentar um dispositivo específico.

Um exemplo clássico disso seria a mudança de um stream em HD para uma saída SD. Novamente, isso terá efeitos significativos no tempo de processamento e na taxa de bits de saída. Em um cenário em que dois comandos FFmpeg são idênticos, basta ajustar o tamanho do vídeo de saída para mudar o tamanho do arquivo resultante e, de fato, a taxa de bits em um modelo de streaming.

Para exemplificar isso, pegamos um exemplo de ponto médio de cada um dos modos de taxa de bits e simplesmente adicionamos parâmetros de redimensionamento.

Modo Q
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -vf scale=640x480 -c:a libvorbis 640x480_Q_crf_10_120s_tears_of_steel_1080p.webm
Modo CQ
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
Modo VBR
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
Modo CBR
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

Tabela de resultados para redimensionamento

Arquivo Codificar min Tamanho do arquivo em disco
640 x 480_Q_crf_10_120s_tears_of_steel_1080p.webm 5 3,4 MB
640 x 480_CQ_crf_0_120s_tears_of_steel_1080p.webm 2 22,4 MB
640x480_VBR_good_5_120s_tears_of_steel_1080p.webm 1 22,6 MB
640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm 4 23MB

Para facilitar a comparação, estes são os mesmos comandos do FFmpeg dos nossos exemplos anteriores, mas sem o escalonamento:

Arquivo Codificar min Tamanho do arquivo em disco
Q_crf_10_120s_tears_of_steel_1080p.webm 56 126MB
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24,1 MB
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23,9 MB
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 24,8 MB

Como você verá, há uma redução notável no tamanho dos arquivos de saída para cada um. Embora haja, na maioria dos exemplos, uma redução no tempo de codificação, no modo Q, o tempo de codificação realmente aumentou. Compactar um vídeo "mais" requer mais esforço, portanto, mesmo que seja esperado que o arquivo de saída seja menor se a qualidade não for limitada (como está no modo Q), isso pode aumentar na verdade o tempo necessário para produzir o arquivo de saída. Não presuma que um arquivo menor sempre poderá ser entregue mais rapidamente pelo processo de codificação.

Redimensionamento e redução da taxa de bits em combinação

Como comparação final, os exemplos a seguir executam novamente os exemplos de CQ, VBR e CBR de redimensionamento, mas desta vez restringimos a taxa de bits de destino a um nível de 500 kbps, aproximadamente um quarto (de acordo com a redução do tamanho da imagem).

Modo CQ
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 350k -maxrate 550k -crf 10 -vf  scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
Modo VBR
ffmpeg -i "120s_tears_of_steel_1080p.webm" -c:v vp9  -b:v 500k \
  -minrate 350k -maxrate 500k -quality good -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
Modo CBR
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

Tabela de resultados para redimensionamento e redução da taxa de bits de destino

Arquivo Codificar min Tamanho do arquivo em disco
640 x 480_CQ_500_crf_0_120s_tears_of_steel_1080p.webm 1 7MB
640x480_VBR_500_good_5_120s_tears_of_steel_1080p.webm 1 7MB
640x480_CBR_500_realtime_5_120s_tears_of_steel_1080p.webm 1 7,6 MB

Como você pode ver, o tempo de codificação foi reduzido.