Je dois adapter des vidéos à 640x360 (le maximum que le lecteur de mon téléphone peut gérer), tout en préservant également le rapport d'aspect , mais je veux également que la vidéo reste inchangée si elle est inférieure à 640x360 (inutile de la mettre à l'échelle après tout).
Existe-t-il un moyen d'obtenir ce comportement en utilisant la ligne de commande de ffmpeg?
min(…)
mais certainement plus facile avec un script simple qui analyse les dimensions. Voir ma commande ici pour un exemple de ce qui peut être fait: superuser.com/questions/547296/…Réponses:
Avec les nouvelles versions de ffmpeg, vous pouvez utiliser l' option
scale
du filtreforce_original_aspect_ratio
. Par exemple, pour adapter une vidéo en 1280 × 720, sans mise à l'échelle (voir cet article pour plus d'informations):Ici, le
scale
filtre est mis à l'échelle à 1280 × 720 si la vidéo d'entrée est plus grande que cela. S'il est plus petit, il ne sera pas mis à l'échelle. Lepad
filtre est nécessaire pour amener la vidéo de sortie à 1280 × 720, au cas où son rapport d'aspect ou sa taille diffère de la taille cible.Avec les anciennes versions de ffmpeg, il existe une solution de contournement quelque peu hacky. Tout d'abord, définissez la largeur, la hauteur et le rapport hauteur / largeur de votre sortie. Cela nous évitera de taper.
Maintenant, appliquons la commande de filtre super complexe que Jim Worrall a écrit :
Je ne vais pas vraiment expliquer ce que tout cela fait, mais fondamentalement, vous pouvez le nourrir n'importe quelle vidéo, et cela ne fera que réduire l'échelle, pas la montée en gamme. Si vous en avez envie, vous pouvez disséquer le filtre dans ses expressions individuelles. Il pourrait être possible de raccourcir cela, mais cela fonctionne aussi comme ça.
la source
Une version plus lisible peut ressembler à ceci:
640 / iw est le facteur d'échelle horizontal et 360 / ih est le facteur d'échelle vertical
Vous souhaitez adapter l'image mise à l'échelle dans la zone de sortie et conserver le rapport d'aspect (stockage). Pour ce faire, sélectionnez le plus petit facteur d'échelle avec la fonction minimale: min (640 / iw, 360 / ih)
Vous voulez empêcher toute mise à l'échelle (c'est-à-dire un facteur de mise à l'échelle> 1.0), vous ajoutez donc une autre fonction minimale: min (1, min (640 / iw, 360 / ih))
L'étape suivante consiste à calculer la résolution de sortie en multipliant le facteur d'échelle par la largeur d'entrée et la hauteur d'entrée:
largeur de sortie = iw * min (1, min (640 / iw, 360 / ih))
hauteur de sortie = ih * min (1, min (640 / iw, 360 / ih))
La dernière étape consiste à construire la commande de filtre. Il n'est pas nécessaire de spécifier la hauteur de sortie, vous pouvez spécifier -1 et ffmpeg conservera le rapport hauteur / largeur en appliquant le même facteur de mise à l'échelle que pour la largeur.
la source
J'ai eu le même problème aussi, mais résolu en ajustant la vidéo dans un carré 640x640 (à cause des vidéos verticales faites avec les smartphones).
Donc, en utilisant la logique immerzi et quelques recherches, je me retrouve avec ceci:
la dernière partie est destinée à avoir une hauteur divisible par 2 dont ont besoin de nombreux encodeurs.
la source