Modos de taxa de bits do VP9 em detalhes
Introdução
Embora forneçamos detalhes gerais sobre os modos de taxa de bits nas páginas de Codificação básica, elas abordam apenas o modo CQ (qualidade restrita).
Este documento detalha outras maneiras práticas de ajustar as taxas de bits do VP9 para otimizar vários cenários. Os exemplos abaixo usam o FFmpeg.
Compactação
As tecnologias de compactação de vídeo, como o VP9, têm como objetivo reduzir a quantidade de dados necessários para transmitir uma imagem inteligível e uma sensação de movimento aos usuários finais.
Uma das principais técnicas usadas para isso é a quantização. Um quantizador simplifica matematicamente vários elementos digitalizados da imagem. Por exemplo, ele pode reduzir a variedade de cores usadas e realizar funções matemáticas nos dados para "suavizar" a falta percebida de resolução fina na faixa de cores reduzida. Há muitas funções desse tipo.
A quantização (ou "Q") está bem descrita no artigo da Wikipédia (em inglês).
No VP9, a quantização é realizada nos coeficientes de transformação. Isso reduz a taxa de bits necessária para manter a qualidade percebida, adicionando à codificação.
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 mudando Q ao longo do tempo, dependendo da complexidade de cada frame.
Otimização de caso de uso
Para permitir que o usuário "ajuste" a compressão VP9 às necessidades específicas dele, é possível ajustar o equilíbrio de qualidade e taxa de bits no momento da compressão inicial usando várias interfaces de programação.
O codificador tem uma compensação deslizante entre velocidade, qualidade e taxa de bits.
Se um usuário se concentrar na qualidade, ele precisa se preparar para tempos de codificação mais longos ou fornecer recursos de processamento mais rápidos e abundantes.
Se um usuário quiser garantir que o arquivo VP9 codificado de saída seja pequeno e possa ser entregue rapidamente, ele precisará reduzir o tempo que a imagem pode ser processada pelo quantizador, o que resultará em um nível de detalhe menor para o trabalho do quantizador.
Se um usuário estiver focado apenas na velocidade de entrega (por exemplo, em um webcast ao vivo ou uma videoconferência bidirecional), a quantização poderá ser completamente subordinada às restrições da taxa em que bytes de dados utilizáveis podem ser transmitidos por uma rede (ou seja, "taxa de bits").
A escolha correta é altamente específica para cada caso de uso. Para facilitar o ajuste desse equilíbrio ao seu caso de uso, o VP9 oferece suporte a uma configuração simples 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 | |
---|---|
Quantizador constante (Q) | Permite especificar um valor de quantizador fixo. A taxa de bits vai variar. |
Qualidade restrita (CQ) | Permite definir um nível máximo de qualidade. A qualidade pode variar dentro dos parâmetros de taxa de bits |
Taxa de bits variável (VBR) | Equilibra a qualidade e a taxa de bits ao longo do tempo dentro das restrições de taxa de bits |
Taxa de bits constante (CBR) | Tenta manter a taxa de bits constante enquanto a qualidade varia. |
P
O modo quantizador constante é uma boa opção para cenários em que as preocupações com o tamanho do arquivo e a taxa de bits são completamente subordinadas à qualidade final.
Os casos de uso para configurações de Q podem ser encontrados em cinema digital, suítes de edição digital ou aplicativos de sinalização digital, em que o conteúdo pode ser entregue em um meio de armazenamento físico ou em um tempo sem restrições, muito antes de ser usado, e em que a saída desejada precisa ser da mais alta qualidade visual.
Otimização da taxa de bits do modo Q do VP9
O modo quantizador constante requer configuração mínima. Como o nome sugere, o modo Q se concentra em manter o quantizador em um nível de "qualidade" desejado e permitir que ele determine o fluxo de dados que quer processar. Tudo o que o usuário precisa definir é a qualidade desejada.
Há mais informações sobre especificidades da qualidade de destino com foco no processamento de imagens (não na taxa de bits) no artigo Codificação básica.
Use os seguintes parâmetros de linha de comando do FFmpeg para otimização da taxa de bits no modo Q:
ffmpeg | |
---|---|
-b:v 0 |
Ao marcar a taxa de bits do vídeo como 0 , definimos explicitamente o modo "Q". |
-g <arg> |
Define o intervalo de frames-chave em frames (o padrão é 240). |
-crf <arg> |
Define o nível máximo de qualidade. Os valores válidos são de 0 a 63. Números menores indicam maior qualidade |
-quality good -speed 0 |
Padrão e recomendado para a maioria dos aplicativos. best é mais uma ferramenta de pesquisa, com melhoria marginal em relação ao -quality good -speed 0 |
-lossless |
Modo sem perdas |
Taxa de bits do modo Q : exemplos do FFmpeg
O primeiro exemplo é uma configuração de modo Q muito extrema e é fornecido apenas para ilustração. Mesmo o processamento do clipe de 120 segundos nesses exemplos leva 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 libvpx-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 -crf
. Observe que -g
não está definido. Portanto, o padrão é 240
. Na prática, -crf
é definido como 10
. Assim, teríamos o mesmo resultado sem incluir nenhum parâmetro no segundo dos três exemplos:
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-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 libvpx-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 libvpx-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 tem tamanhos diferentes no disco. Com -crf
definido como 0
, o arquivo tinha 711,8 MB. Com -crf
definido como 10
, o tamanho do arquivo era de 125,3 MB. Com -crf
definido como 63
, o arquivo tinha 4,5 MB. Em termos muito simples, isso destaca que reduzimos a qualidade do arquivo VP9 codificado resultante ao aumentar o valor do argumento -crf
. Um resumo completo de todos os arquivos de saída está na
Tabela de resultados abaixo.
Agora vamos comparar o efeito de variar a configuração -g
.
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-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 libvpx-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 libvpx-vp9 -g 480 -b:v 0 -quality good \
-speed 0 -c:a libvorbis Q_g_480_120s_tears_of_steel_1080p.webm
Percebemos que a configuração -g 1
produz um arquivo muito grande, de 25,9 MB.
Compare isso com a mudança de -g 240
(definindo explicitamente o mesmo que o padrão),
em que acabamos com um arquivo de 4,5 MB, e -g 480
, em que acabamos com um arquivo de 4,4 MB.
CQ
CQ é um modo recomendado para vídeos baseados em arquivos.
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 de alta movimentação (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, não haverá compressão. Também podemos definir um intervalo inferior, em que, mesmo que a imagem seja preta e o processo de codificação não tenha quase nada a ver, ainda vamos transmitir esses dados, talvez com menos eficiência do que poderíamos, mas com o resultado final de que até mesmo o preto não é significativamente compactado e parece "muito preto".
Além disso, também precisamos definir o limiar do quantizador. No VP9, o limite do quantizador pode variar de 0
a 63
.
Os seguintes parâmetros de linha de comando do FFmpeg são usados para o modo CQ:
ffmpeg | |
---|---|
-b:v <arg> |
Define a taxa de bits desejada (por exemplo, 500k) |
-minrate <arg> -maxrate <arg> |
Define a taxa de bits mínima e máxima. |
-crf <arg> |
Define o nível máximo de qualidade. Os valores válidos são de 0 a 63 , e números menores indicam qualidade maior. |
Modo de taxa de bits CQ: exemplos do FFmpeg
O primeiro exemplo oferece uma restrição razoavelmente ampla. No entanto, em comparação com os exemplos acima para Q, descobrimos que isso força as taxas de bits a um intervalo maior e a qualidade da saída é notavelmente maior. O tamanho do arquivo é muito maior.
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-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 neste caso tinha 20,2 MB no disco, consideravelmente menor do que a codificação do modo Q nos exemplos acima.
Em contraste, no próximo exemplo, restringimos a taxa de bits a um intervalo muito mais bem definido.
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
-minrate 1500k -maxrate 2500k -crf 10 -c:a libvorbis \
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm
Neste 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 libvpx-vp9 -b:v 1000k \
-minrate 750k -maxrate 1400k -crf 10 -c:a libvorbis \
CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm
Neste exemplo final, a saída foi significativamente reduzida em tamanho, caindo para 13,2 MB no 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 muito movimento (por exemplo, esportes). Ele é adequado para entrega baseada em HTTP.
Em um modelo VBR, as cenas de ação podem ser codificadas com uma taxa de bits mais alta do que as cenas "mais fáceis", que são consistentes com o keyframe.
Para modelos grandes de entrega de streaming, os benefícios da VBR podem aumentar significativamente em termos de distribuição e infraestrutura. Quando muitas transmissões VBR são fornecidas pela mesma infraestrutura, isso pode beneficiar todos os espectadores que usam o sistema.
O VP9 VBR também é recomendado para codificar esportes e outros conteúdos com muito movimento. Para conteúdo de alta complexidade, a VBR alcança uma qualidade maior durante períodos de menor movimento.
Os seguintes parâmetros de linha de comando do FFmpeg são usados para o modo VBR:
ffmpeg | |
---|---|
-quality good |
A qualidade good é adequada para vídeo on demand |
-speed <arg> |
Para VÍDEO ON DEMAND, os valores válidos são de 0 a 5, sendo 0 a qualidade mais alta e 5 a mais baixa. (Para transmissões ao vivo, o intervalo é de 5 a 9. Consulte CBR abaixo) |
Modo de taxa de bits VBR: exemplos do FFmpeg
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-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 libvpx-vp9 -b:v 2000k \
-minrate 1500k -maxrate 2500k -quality good -speed 5 -c:a libvorbis \
VBR_good_5_120s_tears_of_steel_1080p.webm
CBR
O modo de taxa de bits constante (CBR) é recomendado para transmissões ao vivo com VP9.
A CBR define a taxa de bits superior como um "limite máximo". Isso significa que o processo de codificação não pode produzir dados a uma taxa que a rede não consiga transmitir.
Por exemplo, para fluxos 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 ela pode transmitir. Se isso acontecer, problemas de sincronização de áudio/vídeo ou frames congelados afetam significativamente a experiência do usuário, mais do que a eficiência reduzida da compactação. Ao garantir que o limite máximo seja definido, o VP9 vai reduzir a qualidade à medida que esse limite for atingido.
Os seguintes parâmetros de linha de comando do FFmpeg são usados para o modo CBR:
ffmpeg | |
---|---|
-quality realtime |
A qualidade realtime é adequada para transmissões ao vivo |
-speed <arg> |
Para transmissões ao vivo, os valores válidos são de 5 a 9, sendo 5 a qualidade mais alta e 9 a mais baixa. Para vídeo on demand, esses valores são de 0 a 5. Consulte VBR acima.) |
-minrate <arg> -maxrate <arg> |
Define a taxa de bits mínima e máxima. ** Esses valores precisam ser definidos como a mesma taxa de bits -b:v para o modo CBR.** |
Em termos muito simples, fixamos as taxas de bits de destino, mínima e máxima no mesmo valor e informamos ao quantizador que as operações são sensíveis ao tempo.
Modo de taxa de bits CBR: exemplos do FFmpeg
Os exemplos abaixo mostram como definir a taxa de bits para metas de 2 Mbps e 500 kbps:
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 2000k \
-minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-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 libvpx-vp9 -b:v 500k \
-minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-vp9 -b:v 500k \
-minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm
Resultados
Cada uma das codificações acima foi realizada em um sistema Ubuntu Linux com as seguintes especificações:
- Processador: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
- Memória (RAM): 8060 MB (1492 MB usados)
- Gráficos: Intel HD Graphics 530 (Skylake GT2)
- SO: Ubuntu 16.04 LTS
Em todos os casos, o arquivo de origem foi um clipe de um minuto e 20 segundos (1:20) extraído de Tears Of Steel.
Arquivo | Minutos de codificação | Tamanho do arquivo no 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 |
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_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 |
Foi possível notar que definir valores de -speed
acima de 5
transforma a velocidade de processamento do VP9. Embora isso seja um aumento considerável na quantização (observado pelo efeito fortemente "dithered" nas taxas de bits rápidas de qualidade muito baixa), o VP9 ainda é capaz de produzir uma saída de 1080p de baixa taxa de bits muito boa, embora mais adequada para dispositivos móveis menores do que telas maiores.
Considerações para casos de uso com redimensionamento
Obviamente, os modos de taxa de bits do VP9 não são isolados e podem ser combinados com muitos outros argumentos e parâmetros para segmentar casos de uso específicos. 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 mudar um stream HD para uma saída SD. Isso terá efeitos significativos no tempo de processamento e na taxa de bits de saída. Em um cenário em que dois comandos do 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, usamos um exemplo de ponto médio de cada um dos modos de taxa de bits e adicionamos parâmetros de reescalonamento.
Modo Q
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v libvpx-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 libvpx-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 libvpx-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 libvpx-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 reescala
Arquivo | Minutos de codificação | Tamanho do arquivo no disco |
---|---|---|
640x480_Q_crf_10_120s_tears_of_steel_1080p.webm | 5 | 3,4 MB |
640x480_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, esses são os mesmos comandos do FFmpeg dos exemplos anteriores, mas sem o escalonamento:
Arquivo | Minutos de codificação | Tamanho do arquivo no 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ê vai ver, há uma redução notável nos tamanhos dos arquivos de saída para cada um. Embora haja uma redução no tempo de codificação na maioria dos exemplos, no modo Q, o tempo de codificação aumentou. Comprimir um vídeo "mais" exige mais esforço. Portanto, mesmo que o arquivo de saída seja menor se a qualidade não for restrita (como no modo Q), isso pode aumentar o tempo necessário para produzir o arquivo de saída. Não presuma que um arquivo menor sempre pode ser entregue mais rápido pelo processo de codificação.
Redimensionamento e redução da taxa de bits em combinação
Como uma 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 libvpx-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 libvpx-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 libvpx-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 desejada
Arquivo | Minutos de codificação | Tamanho do arquivo no disco |
---|---|---|
640x480_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 ainda mais reduzido.