Respuestas:
sameq
no significa "misma calidad"Varios recursos en la web promueven el uso de la opción sameq
u same_quant
, pero en esencia, están equivocados. El uso sameq
no le da un resultado con la misma calidad que la entrada.
No lo uses, nunca.
La fuente de la confusión fue una documentación mal escrita que implicaba que usar esta opción proporcionaría la misma calidad. Afortunadamente, la opción ha sido eliminada.
Esto es lo que dice la documentación de FFmpeg :
Tenga en cuenta que esto NO ES LA MISMA CALIDAD. No use esta opción a menos que sepa que la necesita.
De hecho, los desarrolladores de FFmpeg habían cambiado el nombre del sameq
que same_quant
sólo para asegurarse, y luego eliminado sameq
/same_quant
por completo; lo que significa que esta opción no existe en FFmpeg reciente, pero este artículo sigue siendo útil para aquellos que usan versiones anteriores de FFmpeg.
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 lo que significa "calidad" para un codificador de video común y lo que influye en la calidad. ¿Por qué un video se ve mejor que el otro cuando se comprime con diferentes velocidades de bits? ¿Qué hace que una conversión pierda y por qué el video es más pequeño que el original después de la codificación?
Cuando codifica 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 una Transformada discreta del coseno , produce una matriz de números que describe, digamos, un campo de 8 × 8 píxeles en el video.
Entonces, sus píxeles de 8 × 8 y la matriz correspondiente inicialmente se verían así: 1
¡Pero esto es demasiados datos! Si queremos comprimir el video, podemos deshacernos de los números en la parte inferior derecha. No explicaré por qué esto es exactamente, pero digamos que los números en la parte superior izquierda son más importantes al describir un bloque de este tipo. La idea general de la transformación es básicamente poner las cosas importantes en la parte superior izquierda.
Para eliminar los números en la parte inferior derecha podemos hacerlos ceros. Si algo es "nada", o simplemente se repite como 0
s, no tendremos que almacenarlo, y así ahorraremos espacio. Matemáticamente, necesitamos cuantificar esta primera matriz aplicando otra matriz, una "matriz de cuantización".
Esto dará como resultado una matriz que ahora tiene considerablemente menos números y muchos ceros:
El resultado de esto es que convertimos la primera matriz de alta calidad con muchos números en una matriz que aún se parece a los mismos 8 × 8 píxeles, pero con menos calidad porque tiene menos números para describir esos píxeles. Si compara el bloque visualmente, son similares, pero ya no son lo mismo.
Aquí, la matriz de cuantificación determina la calidad . Esto es importante. Podemos usar 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, peor será la calidad, pero más podremos comprimir el video, porque básicamente podemos "tirar" los ceros aquí.
sameq
?Supongamos que codifica un video y desea establecer una determinada calidad. Como ya aprendimos, las diferentes matrices de cuantificación conducen a una calidad diferente, por lo que cuando le decimos a nuestro codificador que use la calidad x
, seleccionará la matriz de cuantificación adecuada y
para obtener esa calidad, sea cual sea. El resultado es un video comprimido con la y
matriz. 2
Y aquí está la parte interesante: sameq
significa "mismo cuantificador". No es "la 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 ahora toma ese video convertido y lo codifica nuevamente, y aplica la sameq
opción, FFmpeg, simplemente hablando, seleccionará las mismas matrices de cuantificación que se usaron para el video de entrada.
Esto funciona un poco cuando usa exactamente el mismo códec para entrada y salida, por ejemplo, al convertir un video XviD a un video XviD, pero aún terminará con una peor calidad. 3 Esto se debe a que codificar algo que ya está codificado arrojará 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.
No , no funcionan en los diferentes códecs de vídeo en absoluto. Digamos 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. ¡Entonces esta opción ni siquiera tiene sentido! Desafortunadamente, FFmpeg todavía te permite usarlo.
En pocas palabras: no use esa opción a menos que sepa específicamente lo que está haciendo. Si desea codificar su video con un códec diferente, pero conserva la calidad, tendrá que experimentar y configurar la calidad usted mismo. Vea si el resultado es satisfactorio, y si no, establezca una calidad más alta. Eso es casi todo lo que puedes hacer.
Finalmente, si desea leer sobre cómo mantener su calidad al volver a codificar, consulte estas publicaciones:
1) La matriz no corresponde a la imagen aquí, realmente. Esto es solo un ejemplo.
2) En realidad, en estos días, la mayoría de los procesos de codificación no solo usan una matriz. Cuando establece una determinada tasa de bits, el codificador utilizará diferentes matrices para obtener una tasa de bits promedio por segundo. Del mismo modo, cuando se establece 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.
-sameq
la opción ha quedado obsoleta y luego eliminada de avconv