Detalles de los modos de tasa de bits de VP9

Introducción

Si bien proporcionamos detalles generales sobre los modos de tasa de bits en nuestras páginas de Codificación básica, solo abordan el modo CQ (calidad restringida).

En este documento, se detallan otras formas prácticas en las que puedes adaptar las tasas de bits de VP9 para optimizar una variedad de situaciones. En los siguientes ejemplos, se usa FFmpeg.

Compresión

Las tecnologías de compresión de video, como VP9, tienen como objetivo reducir la cantidad de datos necesarios para transmitir una imagen inteligible y una sensación de movimiento a los usuarios finales.

Una de las técnicas clave que se usan para lograr esto es la cuantización. Un cuantificador simplifica matemáticamente varios elementos digitalizados de la imagen. Por ejemplo, puede reducir el rango de colores que se usan y, además, realizar funciones matemáticas en los datos para "suavizar" la falta percibida de resolución fina dentro del rango de colores reducido. Existen muchas funciones de este tipo.

La cuantificación (o "Q") se describe bien en su artículo de Wikipedia.

En VP9, la cuantificación se realiza en los coeficientes de transformación. Esto reduce la tasa de bits necesaria para mantener la calidad percibida, ya que se agrega a la codificación.

En última instancia, cuando hay más cuantificación (un número Q más alto), se pierden detalles y la calidad es menor, pero se requieren menos datos para almacenar el fotograma. En la mayoría de los casos, el codificador VP9 alcanza sus objetivos de tasa de bits cambiando Q con el tiempo, según la complejidad de cada fotograma.

Optimización del caso de uso

Para permitir que el usuario "ajuste" la compresión de VP9 según sus necesidades específicas, es posible ajustar el equilibrio entre la calidad y la tasa de bits en el momento de la compresión inicial a través de varias interfaces de programación.

El codificador tiene un equilibrio deslizante entre velocidad, calidad y tasa de bits.

  • Si un usuario se enfoca en la calidad, debe prepararse para tiempos de codificación más largos o proporcionar recursos de procesamiento más rápidos y abundantes.

  • Si un usuario se enfoca en garantizar que el archivo VP9 codificado de salida sea pequeño y se pueda entregar rápidamente, debe estar preparado para reducir la cantidad de tiempo que el cuantificador puede procesar la imagen, lo que generará un menor detalle con el que el cuantificador puede trabajar.

  • Si un usuario se enfoca únicamente en la velocidad de entrega (por ejemplo, en una transmisión web en vivo o una videoconferencia bidireccional), la cuantificación puede ser completamente subordinada a las restricciones sobre la velocidad a la que se pueden transmitir bytes de datos utilizables a través de una red (es decir, la "tasa de bits").

La elección correcta será muy específica para cada caso de uso. Para que sea más sencillo ajustar este equilibrio a tu caso de uso, VP9 admite una configuración directa en cuatro "modos de tasa de bits".

Modos de tasa de bits de VP9

Comencemos por analizar los principales modos de tasa de bits que admite VP9:

Modo
Cuantificador constante (Q) Te permite especificar un valor de cuantificador fijo; la tasa de bits variará.
Calidad restringida (CQ) Te permite establecer un nivel de calidad máximo. La calidad puede variar dentro de los parámetros de la tasa de bits
Tasa de bits variable (VBR) Equilibra la calidad y la tasa de bits a lo largo del tiempo dentro de las restricciones de la tasa de bits.
Tasa de bits constante (CBR) Intenta mantener la tasa de bits bastante constante mientras varía la calidad.

P

Gráfico del modo Q

El modo de cuantificador constante es una buena opción para situaciones en las que las preocupaciones sobre el tamaño del archivo y la tasa de bits son completamente secundarias en comparación con la calidad final.

Los casos de uso para los ajustes de Q se pueden encontrar en el cine digital, las suites de edición digital o las aplicaciones de señalización digital, en las que el contenido se puede entregar en un medio de almacenamiento físico o durante un tiempo ilimitado, con mucha anticipación a que se use el contenido, y en las que el resultado deseado debe ser de la más alta calidad visual.

Optimización de la tasa de bits del modo Q de VP9

El modo Constant Quantizer requiere una configuración mínima. Como su nombre lo indica, el modo Q se enfoca en mantener el cuantificador en un nivel de "calidad" objetivo y permitir que el cuantificador determine el flujo de datos que desea procesar. Todo lo que el usuario debe definir es la calidad objetivo.

En el artículo Codificación básica, se incluye más información sobre los detalles de la calidad objetivo desde un enfoque en el procesamiento de imágenes (no en la tasa de bits).

Usa los siguientes parámetros de línea de comandos de FFmpeg para la optimización de la tasa de bits del modo Q:

ffmpeg
-b:v 0 Si marcas la tasa de bits del video como 0, estableces explícitamente el modo "Q".
-g <arg> Establece el intervalo de fotogramas clave en fotogramas (el valor predeterminado es 240).
-crf <arg> Establece el nivel de calidad máximo. Los valores válidos son de 0 a 63. Los números más bajos indican una mayor calidad.
-quality good -speed 0 Es el valor predeterminado y se recomienda para la mayoría de las aplicaciones. best es más una herramienta de investigación, con una mejora marginal con respecto a -quality good -speed 0
-lossless Modo sin pérdida

Tasa de bits del modo Q : ejemplos de FFmpeg

El primer ejemplo es un ajuste del modo Q muy extremo y se proporciona solo a modo de ilustración. (Incluso procesar el clip de 120 segundos en estos ejemplos llevará varias horas, y el archivo de salida que se produce suele ser mucho más grande que la fuente 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 el efecto de -crf, los siguientes ejemplos solo varían -crf. Ten en cuenta que -g no está definido, por lo que se establecerá de forma predeterminada en 240, y, en la práctica, -crf se establece de forma predeterminada en 10, por lo que habríamos obtenido el mismo resultado sin incluir ninguno de los parámetros en el segundo de los tres ejemplos:

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

El resultado de estos ejemplos difiere en tamaño en el disco. Con -crf establecido en 0, el archivo era de 711.8 MB; con -crf establecido en 10, el tamaño del archivo era de 125.3 MB, y con -crf establecido en 63, el archivo era de 4.5 MB. En términos muy simples, esto destaca que redujimos la calidad del archivo codificado en VP9 resultante al aumentar el valor del argumento -crf. En la siguiente tabla de resultados, se incluye un resumen completo de todos los archivos de salida.

Ahora comparemos el efecto de variar el parámetro de configuración -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

Observamos que el parámetro de configuración -g 1 genera un archivo muy grande, de 25.9 MB. Compara esto con el cambio de -g 240 (establecer explícitamente el mismo valor que el predeterminado), en el que terminamos con un archivo de 4.5 MB, y -g 480, en el que terminamos con un archivo de 4.4 MB.

CQ

CQ es un modo recomendado para los videos basados en archivos.

Gráfico del modo de CQ

Para la mayoría de los tipos de contenido, recomendamos usar el modo de calidad restringida (CQ), con límites de tasa de bits. La mayoría de los videos contienen una combinación de escenas con mucho movimiento (p.ej., secuencias de acción) y escenas con menos detalles (p.ej., conversaciones). El modo CQ permite que el codificador mantenga un nivel de calidad razonable durante las escenas más largas y sencillas (sin desperdiciar bits) y, al mismo tiempo, asigne más bits a las secuencias difíciles.

Sin embargo, debemos restringir el proceso proporcionando un rango superior, de lo contrario, podría no haber compresión en absoluto. También podemos establecer un rango inferior, en el que, incluso si la imagen es negra y el proceso de codificación casi no tiene nada que hacer, seguiremos transfiriendo esos datos, tal vez de forma menos eficiente de lo que podríamos, pero con el resultado final de que incluso el negro no se comprime de forma significativa y se ve "muy negro".

Además, también debemos establecer el umbral del cuantificador. En VP9, el umbral del cuantificador puede variar de 0 a 63.

Los siguientes parámetros de línea de comandos de FFmpeg se usan para el modo de CQ:
ffmpeg
-b:v <arg> Establece la tasa de bits objetivo (p.ej., 500 k)
-minrate <arg>
-maxrate <arg>
Establece la tasa de bits mínima y máxima.
-crf <arg> Establece el nivel de calidad máximo. Los valores válidos son de 0 a 63, y los números más bajos indican una mayor calidad.
Modo de tasa de bits de CQ: ejemplos de FFmpeg

El primer ejemplo proporciona una restricción razonablemente amplia. Sin embargo, en comparación con los ejemplos anteriores para Q, observamos que esto fuerza las tasas de bits a un rango más alto y la calidad de salida es notablemente mayor. El tamaño del archivo es notablemente mayor.

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

En este caso, el archivo de salida ocupó 20.2 MB en el disco, un tamaño notablemente menor que el de la codificación en modo Q de los ejemplos anteriores.

En cambio, para el siguiente ejemplo, restringimos la tasa de bits a un rango mucho más 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

En este caso, el tamaño del archivo de salida fue de 24.1 MB y, en momentos de alta complejidad y movimiento, la calidad del video se reduce visiblemente en comparación con el ejemplo 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

En este último ejemplo, el tamaño del resultado se redujo significativamente, hasta 13.2 MB en el disco.

VBR

Se recomienda el modo de tasa de bits variable (VBR) para transmitir archivos de video on demand con contenido de mucho movimiento (por ejemplo, deportes). Es adecuado para la entrega basada en HTTP.

Gráfico del modo VBR

En un modelo de VBR, las escenas de acción se pueden codificar con una tasa de bits más alta que las escenas "más fáciles", que son coherentes con el fotograma clave.

En el caso de los modelos de entrega de transmisión grandes, los beneficios del VBR pueden acumularse de manera significativa en términos de distribución e infraestructura. Cuando la misma infraestructura entrega muchos streams de VBR, esto puede beneficiar a todos los usuarios que usan el sistema.

También se recomienda el VBR de VP9 para codificar deportes y otro contenido con mucho movimiento. En el caso de contenido de alta complejidad, el VBR logra una mayor calidad durante los períodos de menor movimiento.

Los siguientes parámetros de línea de comandos de FFmpeg se usan para el modo VBR:
ffmpeg
-quality good La calidad good es adecuada para el video on demand
-speed <arg> En el caso de VIDEO ON DEMAND, los valores válidos son de 0 a 5, donde 0 es la calidad más alta y 5 es la más baja. (Para la transmisión en vivo, el rango es de 5 a 9; consulta CBR a continuación).
Modo de tasa de bits de VBR: ejemplos de 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

Se recomienda el modo de tasa de bits constante (CBR) para la transmisión en vivo con VP9.

Gráfico del modo CBR

Básicamente, el CBR establece el límite superior de la tasa de bits como un "límite fijo". Esto significa que el proceso de codificación no puede producir datos a una velocidad que la red no pueda admitir.

Por ejemplo, para las transmisiones de comunicación en tiempo real (videoconferencias), es importante que la aplicación de codificación no inunde la red con más datos de los que puede transportar. Si es así, los problemas de sincronización de audio y video o los fotogramas congelados afectan significativamente la experiencia del usuario, más que la eficiencia de compresión reducida. Si se garantiza que se defina el límite superior, VP9 reducirá la calidad a medida que se alcance ese límite.

Los siguientes parámetros de línea de comandos de FFmpeg se usan para el modo CBR:
ffmpeg
-quality realtime La calidad realtime es adecuada para la transmisión en vivo
-speed <arg> En el caso de las transmisiones en vivo, los valores válidos son del 5 al 9, donde 5 es la calidad más alta y 9, la más baja. (En el caso del video on demand, estos valores van de 0 a 5. Consulta VBR más arriba.
-minrate <arg>
-maxrate <arg>
Establece la tasa de bits mínima y máxima ** Estos valores deben establecerse en el mismo valor de tasa de bits de -b:v para el modo CBR** .

En términos muy simples, fijamos la misma cantidad de bits por segundo objetivo, mínima y máxima, y le indicamos al cuantificador que las operaciones son sensibles al tiempo.

Modo de tasa de bits CBR: ejemplos de FFmpeg

En los siguientes ejemplos, se explora la configuración de la tasa de bits en objetivos de 2 Mbps y 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 una de las codificaciones anteriores se realizó en un sistema Ubuntu Linux con las siguientes especificaciones:

  • Procesador: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • Memoria (RAM): 8060 MB (1492 MB en uso)
  • Gráficos: Intel HD Graphics 530 (Skylake GT2)
  • SO: Ubuntu 16.04 LTS

En todos los casos, el archivo fuente fue un clip de un minuto y veinte segundos (1:20) extraído de Tears Of Steel.

Archivo Minutos codificados Tamaño del archivo en el 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 21 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

Se observó que establecer valores de -speed superiores a 5 transforma la velocidad de procesamiento de VP9. Si bien esto representa un aumento considerable en la cuantificación (que se observa en el efecto de "tramado" en las tasas de bits rápidas de muy baja calidad), VP9 aún puede producir una salida de 1080p de muy buena calidad con una tasa de bits baja, aunque es más adecuada para dispositivos móviles más pequeños que para pantallas más grandes.

Consideraciones para los casos de uso con cambio de escala (cambio de tamaño)

Obviamente, los modos de tasa de bits de VP9 no están aislados y se pueden combinar con muchos otros argumentos y parámetros para segmentar específicamente los casos de uso. Un caso de uso típico puede ser cambiar el tamaño de las dimensiones del video de salida para segmentar un dispositivo específico.

Un ejemplo clásico sería cambiar una transmisión en HD a una salida en SD. Nuevamente, esto tendrá efectos significativos en el tiempo de procesamiento y la tasa de bits de salida. En una situación en la que dos comandos de FFmpeg son idénticos, el simple ajuste del tamaño del video de salida cambiará el tamaño del archivo resultante y, de hecho, su tasa de bits en un modelo de transmisión.

Para ejemplificar esto, tomamos un ejemplo de punto medio de cada uno de los modos de tasa de bits y simplemente agregamos parámetros de cambio de escala.

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

Tabla de resultados para el cambio de escala

Archivo Minutos codificados Tamaño del archivo en el 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 23 MB

Para facilitar la comparación, estos son los mismos comandos de FFmpeg de nuestros ejemplos anteriores, pero sin el escalamiento:

Archivo Minutos codificados Tamaño del archivo en el disco
Q_crf_10_120s_tears_of_steel_1080p.webm 56 126 MB
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 verás, hay una reducción notable en los tamaños de los archivos de salida para cada uno y, si bien en la mayoría de los ejemplos hay una reducción en el tiempo de codificación, en el modo Q, el tiempo de codificación en realidad aumentó. Comprimir un video "más" requiere más esfuerzo, por lo que, incluso si se espera que el archivo de salida sea más pequeño si la calidad no está restringida (como en el modo Q), esto puede aumentar el tiempo necesario para producir el archivo de salida. No supongas que un archivo más pequeño siempre se puede entregar más rápido con el proceso de codificación.

Cambio de escala y reducción de la tasa de bits en combinación

Como comparación final, los siguientes ejemplos vuelven a ejecutar los ejemplos de CQ, VBR y CBR de cambio de escala, pero esta vez restringimos la tasa de bits objetivo a un nivel de 500 kbps, aproximadamente un cuarto (en consonancia con la reducción del tamaño de la imagen).

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

Tabla de resultados para el cambio de escala y la reducción de la tasa de bits objetivo

Archivo Minutos codificados Tamaño del archivo en el disco
640x480_CQ_500_crf_0_120s_tears_of_steel_1080p.webm 1 7 MB
640x480_VBR_500_good_5_120s_tears_of_steel_1080p.webm 1 7 MB
640x480_CBR_500_realtime_5_120s_tears_of_steel_1080p.webm 1 7.6 MB

Como puedes ver, el tiempo de codificación se acortó aún más.