Comment changer la taille du cadre, en préservant la largeur (en utilisant ffmpeg)?


21

Je suis nouveau sur ce site StackExchange et j'utilise l'encodeur FFmpeg. J'ai une vidéo de 720x480 (3: 2) que je voudrais changer en 720x406 (16: 9) pour correspondre aux autres vidéos que j'ai pour un site. J'ai essayé différentes combinaisons de commandes, notamment:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Je me retrouve avec une vidéo qui a été réduite à la hauteur spécifiée, mais qui n'a pas conservé la largeur. Il se termine à 608x406 ou environ. J'ai joué avec différentes versions graphiques de FFmpeg aujourd'hui, et elles semblent faire la même chose.

Quelles seraient les options / paramètres appropriés à passer (en supposant que j'aurais plus de contrôle via la ligne de commande) pour atteindre la taille d'image souhaitée?

Réponses:


36

utiliser le filtre d'échelle le fera, mais il y a un peu plus.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

créera un film avec les dimensions de pixels requises, mais si vous regardez la sortie, vous constaterez qu'elle ajoute des informations dans les métadonnées afin qu'elle soit lue au même rapport d'aspect que l'original, en utilisant des pixels non carrés. Donc, si vous souhaitez étirer le film de façon anamorphosée à un nouveau rapport hauteur / largeur, vous devez définir manuellement le rapport hauteur / largeur pixel, appelé SAR pour "Sample Aspect Ratio", donc pour les pixels carrés, utilisez:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Alternativement, vous pouvez définir le rapport hauteur / largeur d'affichage comme vous le souhaitez, ainsi:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

Ce que je fais avec la commande -vf et les expressions x = y, z = a qui suivent crée une chaîne de filtres . Les filtres peuvent être assez complexes, mais dans l'utilisation la plus simple, ils prennent la forme effect=parameter,nexteffect=anotherparameteret ils sont traités dans l'ordre où vous les écrivez.

Vous voudrez peut-être mettre des commandes supplémentaires pour le codec et ainsi de suite, par exemple -c:v libx264pour utiliser l'encodeur x264 mp4, et quelque chose comme -crf 20pour définir le facteur de taux constant à 20 (généralement un assez bon compromis entre taille et qualité). Ainsi, une commande raisonnablement complète ressemblerait à:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

Le profil principal est bon pour la compatibilité de l'appareil, le slowpréréglage pour l'encodeur libx264 est un assez bon équilibre entre vitesse et qualité, c'est donc un bon cheval de bataille pour l'encodage Web général. Vous pouvez le rendre plus rapide en utilisant fastou veryfastou plus lentement avec veryslowet placebole rendra toujours légèrement meilleur qu'au veryslowdétriment d'un temps de traitement beaucoup plus long (d'où le nom).

BTW Ne pas utiliser copie -c , cela signifie simplement copier les flux vidéo et audio sans faire quoi que ce soit pour les tout , donc rien vous faire en termes d'échelle, codec, bitrate etc aura un effet.


1
Si vous utilisez des versions récentes de ffmpeg, vous n'avez plus besoin de spécifier x264 comme codec, mais cela vaut peut-être la peine de regarder les paramètres que vous souhaitez.
stib

1
Je pense que les métadonnées n'ont qu'un champ DAR. Donc, utiliser ne setsarfait que définir indirectement le DAR?
jiggunjer

Je dois utiliser "-c copy", mais de l'autre côté, je veux redimensionner l'écran. Comment puis-je atteindre cet objectif?
Dr.jacky

1
@ Mr.Hyde vous devriez poser cette question comme une nouvelle question au lieu de la poser dans un commentaire
stib
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.