Compression vidéo avec ffmpeg - Qualité constante


1

J'essaie de compresser des vidéos de 10 secondes à différents débits avec ffmpeg. Mon objectif est d’obtenir la même vidéo avec différentes qualités (de très faible à très élevée). Je ne veux pas toucher la partie audio et j'utilise le H264 comme codec vidéo. J'utilise le CLI suivant:

ffmpeg -i input.mkv -c:v libx264 -b:v $j'k' -c:a copy output.mkv

Où $ j varie de 150 à 4000.

Mon problème est que je reçois des vidéos compressées pendant 10 secondes, mais que la qualité n’est pas constante dans le temps. Voici un exemple: avec un débit très faible ($ j = 150), au début (entre 0 et 3s), la vidéo est vraiment médiocre mais à la fin (entre 8 et 10s), la qualité est correcte! De plus, en regardant la vidéo, on peut voir cette augmentation de la qualité dans le temps. Quelqu'un peut-il m'expliquer ce phénomène? Comment obtenir une qualité constante?

Merci'



Veuillez noter cette question ci-dessous (je viens de le poster): Je pense avoir trouvé un problème dans la version Linux qui saturait le débit dans la première ... obtenez ceci ... TROIS SECONDES de la vidéo. superuser.com/questions/963424/…
Mark Gerolimatos

Réponses:


2

Comme @LordNeckbeard l'a déjà souligné, un débit binaire constant n'est pas la même chose qu'une qualité constante. En fait, c'est tout le contraire. Certaines parties des séquences vidéo sont plus faciles à encoder que d’autres (plus faciles à utiliser, c’est-à-dire qu’elles nécessitent moins de bits), d’autres non. Si vous dépensez tous vos efforts sur les parties faciles, vous allez en manquer pour les parties les plus difficiles.

C'est là qu'intervient une qualité constante. En x264 il y a le Facteur de taux constant , qui fait exactement cela. Je vous suggère de lire l'article lié si vous voulez plus d'informations de base. Fondamentalement, le CRF varie de 0 (sans perte, le meilleur) à 51 (le plus mauvais). Pas de ± 6 à peu près égaux le double ou la moitié du débit.

Donc, pour adapter votre script, procédez comme suit:

for i in $(seq 0 5 51); do 
  ffmpeg -i input.mkv -c:v libx264 -crf $i -c:a copy output-$i.mkv
done

La balance elle-même est - sauf erreur de ma part - proche de la qualité logarithmique, vous pouvez donc calculer vos pas en fonction de la qualité. seq appel.


Avec un débit très faible ($ j = 150), au début (entre 0 et 3s), la vidéo est vraiment médiocre mais à la fin (entre 8 et 10s), la qualité est correcte! De plus, en regardant la vidéo, on peut voir cette augmentation de la qualité dans le temps. Quelqu'un peut-il m'expliquer ce phénomène?

Faire un débit binaire constant n'est pas une tâche facile pour un codeur. Vous lui donnez une certaine valeur avec laquelle travailler, par exemple dites-lui "donnez-moi 150 kBit par seconde", mais l'encodeur ne sait même pas ce qu'il va encoder à la prochaine image.

Alors, combien devrait-il dépenser pour ce cadre? Combien sur le prochain? Certaines images - comme je l’ai mentionné ci-dessus - sont faciles à encoder et ne prennent que quelques kilobits, alors que d’autres peuvent en prendre beaucoup plus. Mais l'encodeur ne peut vraiment regarder que ce qu'il a encodé dans le passé afin de le redimensionner pour de futures images. Prendre également en compte les différents types d'images .

Algorithmiquement, il est très difficile d'utiliser un débit constant. C'est aussi le pire des modes de contrôle de débit offerts par x264. Surtout pour les clips courts, puisque l'encodeur ne saura pas ce qu'il peut attendre sans l'encodage en 2 passes, vous remarquerez peut-être ceci dans votre description: la qualité change radicalement au cours des dix secondes. Mais 150 kBit / s ne suffisent pas pour des vidéos de dimensions assez décentes.


Merci pour cette réponse détaillée! C'était exactement ce à quoi je m'attendais.
MarAja
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.