Quelle est la meilleure façon de convertir un fichier mp4 en webm sans perte de qualité (en utilisant vp8 ou vp9) avec ffmpeg?

Si je fais ffmpeg -i in.mp4 out.webm la qualité est très mauvaise. Je peux spécifier un débit cible via -b:v et un mode de qualité constante via crf, cest-à-dire

ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm

Cela donne une meilleure qualité. Cependant, pour cela, je dois rechercher le débit de la vidéo dentrée (ici 1M).

Jai également remarqué que si vous spécifiez une valeur beaucoup plus grande pour le débit cible que le débit de lentrée (ici par exemple -b:v 100M), ffmpeg semble juste utilisez approximativement le débit de la vidéo dentrée avec vp9 ou un débit légèrement supérieur avec vp8. Cependant, cette solution ne semble pas être la manière prévue de le faire.

Comment choisiriez-vous la valeur crf et pourquoi?

Existe-t-il un paramètre qui choisit automatiquement le débit de le fichier dentrée et une valeur crf appropriée pour obtenir la même qualité que le fichier dentrée?

Commentaires

  • Réglez le débit à 0. Et expérimentez avec crf . Mais votre méthode de débit binaire élevé fonctionne aussi, car la valeur agit comme un plafond et non comme une cible
  • @Mulvya: le débit binaire 0 signifie-t-il quil ny a pas de limite? Je nai ' Je le trouve dans la page de manuel.
  • Avec un débit non défini sur zéro, CRF est contraint par cette valeur. Avec zéro, il ' Ce nest pas le cas. ' est une bizarrerie des encodeurs VPn.
  • Ok, mais si jomets complètement le paramètre de débit, la qualité devient très mauvaise même si je ne lai pas fait ' t donne une limite supérieure pour le débit.
  • Lien pour 200k (voir première option sur). Pour WebM b: v 0, consultez cette page .

Réponse

Réponse

Utiliser le mode de qualité constante à deux passes: ¹

ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm 

Explication:

Régler le débit vidéo sur zéro tout en spécifiant le CRF (Constant Rate Factor) active le mode de qualité constante qui cible un certain niveau de qualité perceptuelle. Pour VP9, le CRF peut aller de 0 (meilleure qualité) à 63 (taille de fichier la plus petite).

Il est important de régler le débit vidéo sur zéro. Si vous ne spécifiez pas de débit vidéo, la valeur par défaut est quelque chose de faible, ce qui vous permet dobtenir le mode Qualité Contraint , où chaque image a un débit binaire maximal. Bien que cela puisse être utile pour la diffusion en continu, cela réduit considérablement la qualité car les images avec beaucoup de mouvement nauront pas la bande passante nécessaire pour bien paraître.

Une autre raison pour laquelle vous perdez de la qualité est que webm (VP9) préfère encoder en deux passes pour de meilleurs résultats. La première passe compile des statistiques sur la vidéo qui sont ensuite utilisées dans la seconde passe pour créer une vidéo plus petite et de meilleure qualité.

Veuillez consulter la documentation de ffmpeg VP9 si vous souhaitez en savoir plus.

Un mot sur le transcodage

En passant, en général, les formats de transcodage (prendre une vidéo compressée et la recompresser avec un codec différent) est une mauvaise idée car vous najouterez pas seulement les erreurs normales de lencodage vidéo avec perte, mais vous gaspillerez des bits dans le nouveau format en essayant de préserver les artefacts de lancien.

Si vous signifie littéralement «sans perte de qualité»

Loption -lossless 1 de lencodeur VP9 de ffmpeg active le mode de qualité sans perte, mais avec une augmentation potentiellement énorme de la taille du fichier.

Tout ce dont vous avez besoin est ceci:

ffmpeg -i input.mp4 -lossless 1 output.webm 

Quand jai essayé -lossless 1 sur un mp4, le webm résultant était 100 fois plus grand, ce qui nétait pas un acceptable pour moi. Cependant, si vos fichiers mp4 sont déjà de très haute qualité, je pense que la différence de taille ne sera pas si grande.


Note de bas de page 1: Si vous « Si vous utilisez Microsoft Windows au lieu dUNIX, remplacez /dev/null par NUL.

Commentaires

  • Excellente réponse merci
  • /dev/null? Quest-ce que cela signifie? Quel serait léquivalent pour les utilisateurs de Windows? Êtes-vous en train décraser input.mp4 lors du premier passage? Cette réponse nécessite plus dexplications sur ce que fait exactement chaque composant. Cela ' offre aux utilisateurs intermédiaires beaucoup dexplications sur comment ça marche.
  • Salut Hatefriend: Ma réponse comprend déjà une longue section dexplication plus un lien pour plus dinformations, donc je ' préfère ne pas la prolonger. Avez-vous vu la note de bas de page concernant Microsoft Windows qui répond à votre question spécifique? Aussi, comme mentionné ci-dessus, le premier passage compi les statistiques sur le fichier dentrée.Il ny a pas lieu de craindre que cela écrase lentrée.
  • Jai essayé de convertir le fichier .MTS en .webm en utilisant ces deux commandes (Ubuntu 20.10, ffmpeg version 4.2.2). Mais jai des erreurs: " Disposition de canal incorrecte 5.1 (côté) pour la famille de mappage spécifiée -1. Erreur lors de linitialisation du flux de sortie 0: 1 – Erreur lors de louverture de lencodeur pour le flux de sortie # 0: 1 – peut-être des paramètres incorrects tels que bit_rate, rate, width ou height "
  • merci pour la réponse. si le transcodage est généralement une mauvaise idée, que recommandez-vous à la place si vous avez besoin de convertir des vidéos mp4 en webm et des vidéos webm en mp4?

Réponse

Sous Linux, jutilise OptimizeVideo , qui est un wrapper autour de ffmpeg qui détecte automatiquement ces paramètres selon Recommandations de Google .

Le résultat est une vidéo dont vous ne pouvez pas distinguer la différence de qualité, mais généralement des ordres de grandeur inférieurs.

Logo

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *