Avec les nouvelles versions de ffmpeg, vous pouvez utiliser l' option scale
du filtre force_original_aspect_ratio
. Par exemple, pour adapter une vidéo en 1280 × 720, sans mise à l'échelle (voir cet article pour plus d'informations):
ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
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. Le pad
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.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Maintenant, appliquons la commande de filtre super complexe que Jim Worrall a écrit :
ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4
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.