Je ne suis pas un gourou ffmpeg, mais cela devrait faire l'affaire.
Tout d'abord, vous pouvez obtenir la taille de la vidéo d'entrée comme ceci:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Avec un ffmpeg raisonnablement récent, vous pouvez redimensionner votre vidéo avec ces options:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Vous pouvez définir la largeur ou la hauteur -1
afin de laisser ffmpeg
redimensionner la vidéo en conservant le rapport hauteur / largeur. En fait, -2
c'est un meilleur choix car la valeur calculée devrait être égale. Vous pouvez donc taper:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
Une fois que vous obtenez la vidéo, elle peut être plus grande que prévu 720x480
car vous laissez ffmpeg
calculer la hauteur, vous devrez donc la recadrer. Cela peut être fait comme ceci:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
Enfin, vous pouvez écrire un script comme celui-ci (peut facilement être optimisé, mais je l'ai gardé simple pour la lisibilité):
#!/bin/bash
FILE="/tmp/test.mp4"
TMP="/tmp/tmp.mp4"
OUT="/tmp/out.mp4"
OUT_WIDTH=720
OUT_HEIGHT=480
# Get the size of input video:
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}
# Get the difference between actual and desired size
W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ]
H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ]
# Let's take the shorter side, so the video will be at least as big
# as the desired size:
CROP_SIDE="n"
if [ ${W_DIFF} -lt ${H_DIFF} ] ; then
SCALE="-2:${OUT_HEIGHT}"
CROP_SIDE="w"
else
SCALE="${OUT_WIDTH}:-2"
CROP_SIDE="h"
fi
# Then perform a first resizing
ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP}
# Now get the temporary video size
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}
# Calculate how much we should crop
if [ "z${CROP_SIDE}" = "zh" ] ; then
DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ]
CROP="in_w:in_h-${DIFF}"
elif [ "z${CROP_SIDE}" = "zw" ] ; then
DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ]
CROP="in_w-${DIFF}:in_h"
fi
# Then crop...
ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT}