Recadrage vidéo FFmpeg : Guide complet des commandes avec exemples
Le filtre crop de FFmpeg est le couteau suisse du recadrage vidéo programmatique. Rapide, sans perte (avec le bon codec), et scriptable. Maîtrisez la syntaxe et évitez les pièges courants.
Syntaxe de base
ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
- w = largeur de sortie
- h = hauteur de sortie
- x = décalage horizontal depuis le coin haut-gauche (0 = bord gauche)
- y = décalage vertical depuis le coin haut-gauche (0 = bord haut)
Toutes les valeurs en pixels. L'évaluation d'expressions permet les maths (voir ci-dessous).
Méthode 1 : Coordonnées pixels explicites
Recadre une fenêtre 1280x720 partant de (100, 50) depuis une source 1920x1080 :
ffmpeg -i input.mp4 -vf "crop=1280:720:100:50" -c:a copy output.mp4
-c:a copy = Copie flux audio (pas de ré-encodage, rapide, sans perte qualité).- La vidéo sera ré-encodée (le recadrage change les pixels). Utilisez
-c:v libx264 -crf 18 -preset slowpour haute qualité.
Méthode 2 : Recadrage relatif / centré (Expressions)
Utilisez iw (largeur entrée) et ih (hauteur entrée) pour des commandes agnostiques à la résolution.
Recadrage centré (Le plus courant)
# Recadre centre 75% largeur x 75% hauteur ffmpeg -i input.mp4 -vf "crop=iw*0.75:ih*0.75:(iw-ow)/2:(ih-oh)/2" -c:a copy output.mp4
ow /oh = largeur/hauteur sortie (calculées depuis les deux premiers args).(iw-ow)/2 centre horizontalement.(ih-oh)/2 centre verticalement.
Conversion ratio (16:9 → 9:16 Vertical)
# Recadre centre vertical 9:16 depuis 16:9 (ex: 1920x1080 -> 607x1080) ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih:(iw-ow)/2:0" -c:a copy vertical.mp4
Supprimer bandes noires (Auto-détection)
# Détecte bandes noires 1 sec, puis recadre ffmpeg -i input.mp4 -vf "cropdetect=24:16:0" -f null - 2>&1 | grep crop | tail -1 # Sortie exemple: [Parsed_cropdetect_0 @ 0x...] crop=1920:800:0:140 # Utilisez valeurs détectées: ffmpeg -i input.mp4 -vf "crop=1920:800:0:140" -c:a copy output.mp4
Méthode 3 : Basé sur pourcentage (Réseaux sociaux rapide)
# Recadre centre 80% largeur, 90% hauteur ffmpeg -i input.mp4 -vf "crop=iw*0.8:ih*0.9:(iw-ow)/2:(ih-oh)/2" output.mp4
Avancé : Recadrage variable dans le temps (Animé / Images-clés)
Utilisez le filtre sendcmd ou crop avec expressions t (timestamp).
# Zoom depuis plein cadre vers centre 50% sur 5 secondes ffmpeg -i input.mp4 -vf " crop= w='iw*max(0.5,1-0.1*t)': h='ih*max(0.5,1-0.1*t)': x='(iw-ow)/2': y='(ih-oh)/2' " -c:a copy zoom_crop.mp4
t = secondes. À t=0: 100%. À t=5: 50%. Assouplissement linéaire.
Pièges critiques
| Problème | Cause | Solution |
|---|---|---|
| Dimensions sortie non divisibles par 2 | H.264/HEVC requièrent largeur/hauteur paires | Utilisez crop='if(gt(iw,ih),-2,ih*9/16)':... ou assurez maths paires. FFmpeg auto-ajuste avec +0 mais avertit. |
| Recadrage dépasse l'entrée | x+w > iw ou y+h > ih | Validez avec ffprobe -v error -select_streams v:0 -show_entries stream=width,height input.mp4 |
| Ratio étiré à la lecture | Lecteur ignore SAR/DAR | Ajoutez -vf "crop=...,setsar=1" ou -aspect 16:9 en sortie. |
| Perte qualité | Défauts ré-encodage (CRF 23) | -c:v libx264 -crf 18 -preset slow explicite (ou -c:v copy si SEULEMENT recadrage I-frames ? Non, crop ré-encode toujours). |
| Dérive audio | Ré-encodage vidéo change légèrement durée | -c:a copy toujours. Si sync critique, -async 1. |
Workflow Pro : Recadrage par lot d'un dossier
# Bash / Zsh / PowerShell for f in *.mp4; do ffmpeg -i "$f" -vf "crop=ih*9/16:ih:(iw-ow)/2:0" -c:v libx264 -crf 20 -preset medium -c:a copy "cropped_${f}" done
Lancez toujours ffprobe d'abord. Scriptez les maths. Utilisez -c:a copy. Archivez les originaux.
