Comment recadrer des images et des vidéos avec FFmpeg
Utilisez le filtre crop de FFmpeg pour conserver une partie rectangulaire d’une image fixe ou de
chaque image d’une vidéo. Par exemple, crop=200:200:50:50 conserve une zone de 200×200 commençant à
50 pixels du bord gauche et à 50 pixels du bord supérieur. Ci-dessous, vous allez recadrer un JPEG
et un MP4, vérifier leurs dimensions, puis appliquer le recadrage d’image à un répertoire avec Bash.
Préparer FFmpeg et vos fichiers
Exécutez les exemples dans Bash sous macOS ou Linux. Installez une version de FFmpeg contenant
ffmpeg, ffprobe et l’encodeur libx264 à l’aide des liens par plateforme de la
page de téléchargement de FFmpeg. Les commandes ont été testées avec
FFmpeg 9.0.1 sous macOS et 6.1.1 sous Ubuntu 24.04.
Vérifiez votre installation :
ffmpeg -version && ffprobe -version && ffmpeg -hide_banner -h encoder=libx264
La dernière commande devrait lister les capacités de l’encodeur. Si elle signale un encodeur
inconnu, installez une version incluant libx264 avant de continuer.
Placez dans votre répertoire de travail un JPEG correctement orienté nommé input.jpg et un MP4 nommé
input.mp4. L’exemple d’image nécessite au moins 250×250 pixels ; le recadrage vidéo fixe nécessite
au moins 1280×720. Les exemples vidéo supposent une vidéo SDR ordinaire à pixels carrés, sans
métadonnées de rotation. Le recadrage de séquences HDR ou anamorphiques nécessite un traitement
supplémentaire des couleurs ou du rapport d’aspect.
Les commandes portant sur un seul fichier utilisent -y : les relancer remplace les fichiers
de sortie qu’elles nomment. Choisissez un autre nom de sortie pour conserver un résultat
précédent, et gardez des noms de sortie distincts de ceux de vos entrées. -nostdin désactive
l’interaction au clavier afin que les commandes fonctionnent aussi sans surveillance.
Consultez les options de commande de FFmpeg.
Choisir le rectangle de recadrage
La syntaxe du filtre est crop=width:height:x:y. Les coordonnées partent de (0,0) dans le coin supérieur
gauche ; x augmente vers la droite et y vers le bas. Le recadrage supprime les pixels
situés hors du rectangle sans redimensionner son contenu.
Pour qu’un rectangle reste à l’intérieur de l’entrée, utilisez des dimensions positives et des
décalages non négatifs, avec x + width au plus égal à la largeur de l’entrée et y + height au plus égal
à sa hauteur. Vérifiez vous-même ces limites : FFmpeg peut ajuster un décalage hors limites pour
que le rectangle tienne, au lieu de signaler une erreur.
Vous pouvez omettre x et y pour centrer le recadrage. Sur une entrée à
sous-échantillonnage de la chrominance, le filtre arrondit normalement les coordonnées et les
dimensions à l’inférieur selon la grille de sous-échantillonnage. Les exemples ci-dessous utilisent
des valeurs paires pour le format 4:2:0 habituel. La
référence de crop de FFmpeg documente ces valeurs par défaut ainsi que
l’option exact pour les recadrages qui nécessitent des coordonnées impaires.
Recadrer des images avec FFmpeg
Recadrez le rectangle décrit ci-dessus et enregistrez-le sous cropped.png :
ffmpeg -hide_banner -nostdin -y -pattern_type none -i input.jpg \
-vf "crop=200:200:50:50" -frames:v 1 -update 1 cropped.png
-frames:v 1 écrit une seule image. Le PNG évite un nouvel encodage JPEG avec perte après le
recadrage. -pattern_type none rend le nom du fichier d’entrée littéral, tandis que -update 1 fait de même
pour le nom du fichier de sortie. Ces options comptent aussi lorsqu’un nom de fichier contient
%03d, que FFmpeg traiterait sinon comme un motif de séquence d’images. Ces comportements
sont documentés dans les options d’entrée d’image
et les options de sortie d’image.
Vérifiez les dimensions de la sortie avec ffprobe :
ffprobe -v error -select_streams v:0 -show_entries stream=width,height \
-of csv=p=0:s=x cropped.png
Cette commande devrait afficher 200x200. Ouvrez aussi le PNG : les dimensions seules ne vous
indiquent pas si vous avez conservé le sujet voulu.
Recadrer des vidéos avec FFmpeg
Conservez la zone de 1280×720 située en haut à gauche de chaque image de input.mp4 :
ffmpeg -hide_banner -nostdin -y -i input.mp4 \
-map 0:v:0 -map '0:a:0?' -vf "crop=1280:720:0:0" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -b:a 128k cropped.mp4
La sortie contient de la vidéo H.264 et, si elle existe, la première piste audio encodée en AAC.
Le ? entre guillemets rend le mappage audio facultatif, de sorte que les entrées sans son
fonctionnent aussi. Les pistes vidéo et audio supplémentaires ainsi que les sous-titres sont
omis. Consultez la documentation sur le mappage des flux.
Le recadrage nécessite de décoder et de réencoder la vidéo ; -c:v copy ne peut donc pas être
combiné avec ce filtre. -crf 18 est un réglage de qualité pour l’encodage H.264 avec perte.
-pix_fmt yuv420p sélectionne une sortie 4:2:0, qui exige une largeur et une hauteur paires avec cet encodeur.
Recadrer un carré centré
Pour une vidéo en paysage comme en portrait, choisissez la plus petite dimension de l’entrée et arrondissez-la au nombre pair inférieur :
ffmpeg -hide_banner -nostdin -y -i input.mp4 \
-map 0:v:0 -map '0:a:0?' -vf "crop=w='trunc(min(iw,ih)/2)*2':h=ow" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -b:a 128k square.mp4
Ici, iw et ih sont les dimensions de l’entrée, et ow est la largeur de
recadrage calculée. Omettre x et y centre le carré, sous réserve de l’arrondi à la
grille de chrominance décrit ci-dessus. Une entrée de 1920×1080 produit 1080×1080 pixels. Il
s’agit d’un recadrage central fixe : un sujet proche d’un bord peut donc encore être coupé.
Vérifier la sortie vidéo
Inspectez les dimensions et les codecs à l’aide des
entrées sélectionnées de ffprobe :
ffprobe -v error -show_entries stream=codec_type,codec_name,width,height \
-of json cropped.mp4
Attendez-vous à un flux vidéo h264 de largeur 1280 et de hauteur 720, ainsi qu’à un flux
aac si l’entrée contenait de l’audio. Remplacez cropped.mp4 par square.mp4 pour vérifier le
recadrage carré. Lisez le résultat pour vérifier le cadrage et le son sur toute la durée du clip.
Recadrer des images JPEG par lots
Enregistrez ce script sous crop-images.sh et exécutez bash crop-images.sh depuis le répertoire contenant vos
JPEG. Il traite les fichiers non masqués de ce répertoire dont le nom se termine par .jpg en
minuscules, avec le même recadrage de 200×200 à (50,50). Chaque entrée doit respecter le
minimum de 250×250 requis pour ce rectangle.
#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob
images=(./*.jpg)
if (( ${#images[@]} == 0 )); then
printf '%s\n' 'No .jpg files found.' >&2
exit 1
fi
mkdir ./cropped
for image in "${images[@]}"; do
name=${image##*/}
ffmpeg -hide_banner -loglevel error -nostdin -y \
-pattern_type none -i "$image" -vf "crop=200:200:50:50" \
-frames:v 1 -update 1 "./cropped/${name%.jpg}.png"
done
Le script exige un nouveau répertoire cropped : s’il existe déjà, mkdir échoue et le script
s’arrête avant de traiter quoi que ce soit. Conservez les résultats de ce répertoire et
choisissez un nouveau répertoire de sortie dans le script pour une autre exécution. Les sorties
sont des PNG placés dans un sous-répertoire ; elles ne peuvent donc pas devenir des entrées lors
de l’exécution suivante.
Les guillemets et le préfixe ./ gèrent les espaces et les tirets initiaux dans les noms de
fichiers ; les options d’image gèrent les motifs de pourcentage littéraux des deux côtés. Un
répertoire vide produit une erreur. Si FFmpeg échoue sur une image illisible ou trop petite pour
le recadrage, le script s’arrête ; les fichiers déjà écrits restent dans cropped, inspectez donc
les éventuels résultats partiels avant de réessayer.
