====== Script Bash pour réduire des vidéos avec FFMPEG ====== ===== Introduction ===== J'ai mis au point ce petit script que j'utilise pour réduire la taille de vidéos. Les options permettent de choisir : * la résolution * le framerate * de garder le son ou de l'enlever * le container de sortie (mp4 ou mkv) * le codec (h264 ou h265) * le preset d'encodage * la qualité crf C'est volontairement limité mais j'utilise ça tous les jours et ça me suffit. C'est probablement du code dégueulasse, mais je ne suis pas informaticien. Ça ajoute //-resized// au nom du fichier original pour le fichier de sortie, qui n'est pas effacé. ===== Exemples d'utilisation ===== Convertir video.mp4 * en conservant sa résolution originale * en conservant son framerate original * en copiant la piste sonore telle quelle * vers un container mp4 * en utilisant le codec h265 * en utilisant le preset FFMPEG veryfast * en utilisant la qualité crf 35 video_converter.sh video.mp4 resolution fps sound mp4 265 veryfast 35 Convertir video.mp4 * avec une résolution de sortie HD (720p) * avec un framerate de 30 images/sec * en enlevant la piste sonore * vers un container mkv * en utilisant le codec h264 * en utilisant le preset FFMPEG slow * en utilisant la qualité crf 20 video_converter.sh video.mp4 1280:720 30 nosound mkv 264 slow 20 ===== Code ===== #!/bin/bash if [ -z "$1" ]; then echo "--------------------------------" echo "| Video converter using FFMPEG |" echo "--------------------------------" echo "Usage:" echo "1st argument is filename" echo "2nd argument is desired resolution (format: '1280:720' or '-1:720' or '1280:-1'). To keep the original resolution, enter the word 'resolution'" echo "3rd argument is if you want to keep the current framerate (enter 'fps') or change it, in which case enter a numeric value" echo "4th argument is if to keep sound or remove it ('sound', 'nosound')" echo "5th argument is the container : 'mp4' or 'mkv'" echo "6th argument is codec ('264' or '265')" echo "7th argument is the preset : 'ultrafast', 'superfast', 'veryfast', 'faster', 'fast', 'medium', or 'slow'" echo "8th argument is crf value (51-0). Optional. If not set, will use the default value for the chosen codec: 23 for x.264 and 28 for x.265 - The lower the value, the better the quality." exit 1 else filename=$1 fi if [ -z "$2" ]; then echo "Please enter either the word 'resolution' to keep it as it is, or the desired resolution in the following format (1280:720 or -1:720 or 1280:-1)" exit 1 elif [ $2 == 'resolution' ]; then resolution="" else resolution="-vf scale=$2" fi if [ -z "$3" ]; then echo "You must tell if you want to keep the current framerate or if you want to convert it ('fps' or an integer)" exit 1 elif [ $3 == 'fps' ]; then fps="" else fps="-r $3" fi if [ -z "$4" ]; then echo "You must tell if you want to keep or remove sound from the video with either the 'sound' or 'nosound' flag." exit 1 elif [ $4 == 'nosound' ]; then remove_or_copy_sound="-an" elif [ $4 == 'sound' ]; then remove_or_copy_sound="-c:a copy" else echo "Third argument is invalid." echo "You must tell if you want to keep or remove sound from the video with either the 'sound' or 'nosound' flag." exit 1 fi if [ -z "$5" ]; then echo "You must specify the container, either 'mp4' or 'mkv'." exit 1 elif [ $5 == 'mp4' ]; then container=".mp4" elif [ $5 == 'mkv' ]; then container=".mkv" else echo "Fifth argument is invalid." echo "You must specify the container, either 'mp4' or 'mkv'." exit 1 fi if [ -z "$6" ]; then echo "You must supply the desired output codec ('264' or '265')" exit 1 elif [ $6 == '264' ]; then codec='libx264' crf='23' elif [ $6 == '265' ]; then codec='libx265' crf='28' else echo "Sixth argument is invalid" echo "You must supply the desired output codec ('264' or '265')" exit 1 fi case $7 in "ultrafast"|"superfast"|"veryfast"|"faster"|"fast"|"medium"|"slow") preset=$7 ;; *) echo "Seventh argument: you must supply the preset ('ultrafast', 'superfast', 'veryfast', 'faster', 'fast', 'medium', or 'slow')" exit 1 ;; esac if [ "$8" ] then crf=$8 fi ffmpeg -i "$filename" $resolution $fps -c:v $codec -crf $crf -preset $preset $remove_or_copy_sound "${filename%.*}-resized${container}" ===== Bonus : convertir tous les fichiers d'un répertoire ===== Pour ligne de commande Linux et MacOS. Utiliser une simple boucle //for// avec substitution de paramètre. Exemple : for i in *.mp4; do video_converter.sh "$i" resolution fps sound mp4 265 veryfast 35; done ---- [<6>]