web-dev-qa-db-fra.com

Qu'est-ce que l'option "sameq" ou "same_quant" dans FFmpeg? Est-ce que cela signifie "même qualité"?

J'ai souvent vu des commandes FFmpeg utilisant l'option sameq, par exemple

ffmpeg -i input.mp4 -sameq output.avi

Qu'est-ce que ça veut dire? Est-ce que cela signifie "même qualité"? Si non, que devrais-je utiliser à la place?

28
slhck

sameqne signifie pas "qualité identique"

Plusieurs ressources sur le Web encouragent l'utilisation de l'option sameqou same_quant, mais elles sont fondamentalement fausses. Utiliser sameqne vous donne pas un résultat avec la même qualité que l'entrée.
Ne l'utilisez jamais.

La source de confusion était une documentation mal rédigée qui impliquait que l’utilisation de cette option fournirait la même qualité. Heureusement, l'option a été supprimée.

Voici ce que la documentation FFmpeg dit:

Notez que ce n'est pas la même qualité. N'utilisez cette option que si vous savez que vous en avez besoin.

En fait, les développeurs de FFmpeg avaient changé le nom de sameqen same_quant pour s'en assurer, puis supprimé sameqname __/same_quant tout à fait; ce qui signifie que cette option n'existe pas dans la version récente de FFmpeg, mais que cet article reste utile pour ceux qui utilisent des versions plus anciennes de FFmpeg.


Comment fonctionne la compression vidéo?

Maintenant que nous avons éclairci cette question, examinons quelques détails techniques.

Pour comprendre pourquoi cela ne fonctionne pas de manière fiable, nous devons comprendre le concept de "qualité" pour un encodeur vidéo commun et ce qui influence la qualité. Pourquoi une vidéo a-t-elle un meilleur rendu que l'autre lorsqu'elle est compressée avec différents débits? Qu'est-ce qui rend une conversion avec perte et pourquoi la vidéo est-elle plus petite que l'original après l'encodage?

Lorsque vous codez une vidéo, vos données d'entrée sont converties en une dimension différente en appliquant d'abord une transformation mathématique à des blocs de pixels. Cette transformation, principalement une Transformée en cosinus discrète , génère une matrice de nombres décrivant, par exemple, un champ de 8 × 8 pixels dans la vidéo.

Ainsi, vos 8 × 8 pixels et la matrice correspondante ressembleraient initialement à ceci:1

Original Image

Mais c'est trop de données! Si nous voulons compresser la vidéo, nous pouvons réellement supprimer les chiffres en bas à droite. Je ne vais pas expliquer pourquoi c'est exactement, mais disons simplement que les nombres en haut à gauche sont plus importants pour décrire un tel bloc. L’idée de la transformation est essentiellement de placer les choses importantes en haut à gauche.

Pour supprimer les nombres en bas à droite, nous pouvons leur donner des zéros. Si quelque chose n'est "rien", ou si vous répétez simplement 0s, nous n'aurons pas à le stocker, et de cette façon nous économiserons de l'espace. Mathématiquement, il faut quantize == cette première matrice en appliquant une autre matrice, une "matrice de quantification".

Cela donnera une matrice qui contient maintenant beaucoup moins de nombres et beaucoup de zéros:

Compressed Image

Le résultat est que nous avons transformé la première matrice de haute qualité avec beaucoup de nombres en une matrice qui ressemble toujours aux mêmes pixels 8 × 8, mais avec une qualité inférieure, car elle comporte moins de nombres pour décrire ces pixels. Si vous comparez les blocs visuellement, ils sont similaires, mais ils ne sont plus tout à fait les mêmes.

Ici, la matrice de quantification détermine la qualité . C'est important. Nous pouvons utiliser différentes matrices de quantification pour différentes qualités. Certaines matrices de quantification laissent la matrice d'origine presque intacte, d'autres pas. Plus nous supprimons de nombres, plus la qualité sera bonne , , mais plus nous pouvons compresser , car nous pouvons en principe "jeter" les zéros ici.

Qu'est-ce que cela a à voir avec sameqname__?

Supposons que vous encodiez une vidéo et que vous souhaitiez définir une certaine qualité. Comme nous l'avons déjà appris, différentes matrices de quantification conduisent à une qualité différente. Ainsi, lorsque nous demandons à notre codeur d'utiliser la qualité xname__, il sélectionne la matrice de quantification appropriée ypour obtenir cette qualité, quelle qu'elle soit. Le résultat est une vidéo compressée à l'aide de la matrice yname__.2

Et voici la partie intéressante: sameqsignifie "même quantificateur". Pas "de même qualité". Si vous avez une version non récente de FFmpeg, vous pouvez toujours la trouver dans ffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

Ainsi, lorsque vous prenez maintenant cette vidéo convertie et que vous l'encodez à nouveau, et que vous appliquez l'option sameqname__, FFmpeg sélectionnera simplement les mêmes matrices de quantification que celles utilisées pour la vidéo d'entrée.

Cela un peu fonctionne lorsque vous utilisez exactement le même codec pour les entrées et les sorties, par exemple. lors de la conversion d'une vidéo XviD en une vidéo XviD, mais vous obtiendrez toujours une qualité inférieure.3 C’est parce que coder quelque chose qui est déjà codé jettera encore plus d’informations. Dans l'exemple ci-dessus, nous allons créer encore plus de zéros dans notre matrice et le résultat sera pire.

Cela ne fonctionne pas sur différents codecs vidéo. Supposons que vous convertissez une vidéo codée XviD avec x264.4 Pour ces deux codecs, les matrices de quantification utilisées en interne sont différentes - elles n'ont pas les mêmes coefficients. Donc, cette option n'a même pas de sens! Malheureusement, FFmpeg vous permet toujours de l'utiliser.

En bout de ligne: S'il vous plaît, n'utilisez pas cette option si vous ne savez pas exactement ce que vous faites. Si vous souhaitez encoder votre vidéo avec un codec différent tout en conservant la qualité, vous devrez alors expérimenter et définir la qualité vous-même. Voir si le résultat est satisfaisant, et si non, définissez une qualité supérieure. C'est à peu près tout ce que vous pouvez faire.

Enfin, si vous souhaitez savoir comment conserver votre qualité lors du réencodage, consultez ces publications:


1) La matrice ne correspond pas à l'image ici, vraiment. C'est juste un exemple.
2) En fait, de nos jours, la plupart des processus d’encodage n’utilisent pas seulement une matrice. Lorsque vous définissez un certain débit, le codeur utilise différentes matrices pour obtenir un débit moyen par seconde. De même, pour définir une certaine qualité, les codeurs modernes utilisent différentes matrices en fonction du contenu. En effet, certains contenus sont "plus faciles" à compresser que d'autres et nécessitent moins de quantification pour obtenir le même facteur de compression.
3) Exemple: ffmpeg -i input.avi -sameq -c:v libxvid output.avi. Ne l'utilisez pas. S'il vous plaît.
4) Exemple: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. Ne l'utilisez pas non plus. Je suis serieux.

57
slhck