Outils pour utilisateurs

Outils du site


informatique:generalites:script_bash_conversion_video_ffmpeg

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

informatique/generalites/script_bash_conversion_video_ffmpeg.txt · Dernière modification : 30/08/2021 09:36 de lauberterio