¿Qué es la opción "sameq" o "same_quant" en FFmpeg? ¿Significa "misma calidad"?

¿Qué es la opción "sameq" o "same_quant" en FFmpeg? ¿Significa "misma calidad"?

A menudo, he visto comandos FFmpeg usando la sameqopción, por ejemplo

ffmpeg -i input.mp4 -sameq output.avi

¿Qué quiere decir esto? ¿Significa "misma calidad"? Si no, ¿qué debería usar en su lugar?

Respuesta1

sameqno significa "misma calidad"

Varios recursos en la web promueven el uso de la opción sameqo same_quant, pero en esencia están equivocados. Usar sameqno te da un resultado con la misma calidad que la entrada.
No lo uses, nunca.

La fuente de la confusión fue la documentación mal escrita que implicaba que el uso de esta opción proporcionaría la misma calidad. Afortunadamente, la opción ha sido eliminada.

Esto es lo que la documentación de FFmpegdicho:

Tenga en cuenta que esto NO ES LA MISMA CALIDAD. No utilice esta opción a menos que sepa que la necesita.

De hecho, los desarrolladores de FFmpeg habíancambió el nombrede sameqa same_quantsólo para asegurarse, y luegoeliminado sameq/same_quanten total; lo que significa que esta opción no existe en FFmpeg reciente, pero este artículo sigue siendo útil para quienes usan compilaciones de FFmpeg más antiguas.


¿Cómo funciona la compresión de vídeo?

Ahora que hemos aclarado esto, entremos en algunos detalles técnicos.

Para entender por qué no funciona de manera confiable, debemos comprender el concepto de qué significa "calidad" para un codificador de video común y qué influye en la calidad. ¿Por qué un vídeo se ve mejor que otro cuando se comprime con diferentes velocidades de bits? ¿Qué hace que una conversión tenga pérdidas y por qué el vídeo es más pequeño que el original después de la codificación?

Cuando codifica un video, sus datos de entrada se convierten en una dimensión diferente aplicando primero una transformación matemática a bloques de píxeles. Esta transformación, principalmente unaTransformada de coseno discreta, produce una matriz de números que describen, digamos, un campo de 8×8 píxeles en el vídeo.

Entonces, sus 8×8 píxeles y la matriz correspondiente inicialmente se verían así: 1

Imagen original  

¡Pero son demasiados datos! Si queremos comprimir vídeo, podemos deshacernos de los números que se encuentran en la parte inferior derecha. No explicaré exactamente por qué es así, pero digamos que los números en la parte superior izquierda son más importantes al describir dicho bloque. Básicamente, la idea de la transformación es colocar las cosas importantes en la parte superior izquierda.

Para eliminar los números en la parte inferior derecha podemos convertirlos en ceros. Si algo es "nada", o simplemente se repite como 0s, no tendremos que almacenarlo, y así ahorraremos espacio. Matemáticamente necesitamoscuantizaresta primera matriz aplicando otra matriz, una "matriz de cuantificación".

Esto dará como resultado una matriz que ahora tiene considerablemente menos números y muchos ceros:

Imagen comprimida  

El resultado de esto es que convertimos la primera matriz de alta calidad con muchos números en una matriz que todavía se parece a los mismos 8×8 píxeles, pero con menos calidad porque tiene menos números para describir esos píxeles. Si comparas el bloque visualmente, son similares, pero ya no son exactamente iguales.

Aquí,la matriz de cuantificación determina la calidad. Esto es importante. Podemos utilizar diferentes matrices de cuantificación para diferentes calidades. Algunas matrices de cuantificación dejan la matriz original casi intacta, otras no. Cuantos más números eliminemos, máspeorla calidad obtendrá, pero elmásPodemos comprimir el vídeo, porque aquí básicamente podemos "deshacernos" de los ceros.

¿Qué tiene eso que ver sameq?

Supongamos que codifica un vídeo y desea establecer una determinada calidad. Como ya aprendimos, diferentes matrices de cuantificación conducen a una calidad diferente, por lo que cuando le decimos a nuestro codificador que use calidad x, seleccionará la matriz de cuantificación adecuada ypara obtener esa calidad, sea cual sea. El resultado es un video comprimido usando la ymatriz. 2

Y aquí está la parte interesante:sameqsignifica "mismo cuantificador". No "misma calidad".Si tiene una versión no reciente de FFmpeg, aún puede encontrarla en ffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

Entonces, cuando tome ese video convertido y lo codifique nuevamente, y aplique la sameqopción, FFmpeg, en pocas palabras, seleccionará las mismas matrices de cuantificación que se usaron para el video de entrada.

Esteun pocofunciona cuando usas exactamente el mismo códec para entrada y salida, por ejemplo, al convertir de un vídeo XviD a un vídeo XviD, pero aun así terminarás con peor calidad. 3 Esto se debe a que codificar algo que ya está codificado desperdiciará aún más información. En el ejemplo anterior, crearemos aún más ceros en nuestra matriz y el resultado se verá peor.

Lo hacenotrabajar con diferentes códecs de vídeo. Supongamos que está convirtiendo un video codificado en XviD con x264. 4 Para estos dos códecs, las matrices de cuantificación utilizadas internamente son diferentes: no tienen los mismos coeficientes. ¡Así que esta opción ni siquiera tiene sentido! Desafortunadamente, FFmpeg todavía te permite usarlo.

En pocas palabras: no utilice esa opción a menos que sepa específicamente lo que está haciendo. Si desea codificar su video con un códec diferente, pero conservar la calidad, tendrá que experimentar y configurar la calidad usted mismo. Vea si el resultado es satisfactorio y, en caso contrario, establezca una calidad superior. Eso es todo lo que puedes hacer.

Finalmente, si desea leer más sobre cómo mantener la calidad al volver a codificar, consulte estas publicaciones:


1) La matriz no se corresponde con la imagen aquí, realmente. Este es sólo un ejemplo.
2) En realidad, hoy en día, la mayoría de los procesos de codificación no solo utilizanunomatriz. Cuando establece una determinada velocidad de bits, el codificador utilizará diferentes matrices para obtener una velocidad de bits promedio por segundo. De manera similar, al establecer una determinada calidad, los codificadores modernos emplean diferentes matrices según el contenido. Esto se debe a que algunos contenidos son "más fáciles" de comprimir que otros y requieren menos cuantificación para obtener el mismo factor de compresión.
3) Ejemplo: ffmpeg -i input.avi -sameq -c:v libxvid output.avi. No uses esto. Por favor.
4) Ejemplo: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. No uses esto tampoco. Lo digo en serio.

información relacionada