FFmpeg pour la Production Vidéo
FFmpeg est l'outil essentiel pour le traitement audio/vidéo. Cette compétence couvre les opérations courantes pour les projets vidéo Remotion.
Référence Rapide
GIF vers MP4 (compatible Remotion)
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
Pourquoi ces flags :
-movflags faststart- Déplace les métadonnées au début pour le streaming web-pix_fmt yuv420p- Assure la compatibilité avec la plupart des lecteursscale=trunc(...)- Force des dimensions paires (requises par la plupart des codecs)
Redimensionner une Vidéo
# Vers 1920x1080 (conserver le ratio, ajouter des barres noires)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
# Vers 1920x1080 (recadrer pour remplir)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4
# Redimensionner à une largeur, hauteur auto
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4
Compresser une Vidéo
# Bonne qualité, fichier plus petit (CRF 23 est la valeur par défaut, plus bas = meilleure qualité)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Compression agressive pour aperçu web
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4
# Taille de fichier cible (ex: ~10Mo pour une vidéo de 60s = ~1,3 Mb/s)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4
Extraire l'Audio
# Extraire en MP3
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
# Extraire en AAC
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a
# Extraire en WAV (non compressé)
ffmpeg -i input.mp4 -vn output.wav
Convertir des Formats Audio
# M4A vers MP3 (pour échantillons vocaux ElevenLabs)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3
# WAV vers MP3
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3
# Ajuster le volume
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3
Couper/Recadrer une Vidéo
# Couper à partir d'un timestamp pendant une durée (recommandé - fiable)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4
# Couper d'un timestamp à un autre
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4
# Copie de flux (plus rapide mais peut perdre des trames aux points de coupe)
# À utiliser uniquement lorsque la source a des images clés fréquentes
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4
Remarque : Le ré-encodage est recommandé pour le recadrage. La copie de flux (-c copy) peut supprimer silencieusement la vidéo si le point de recherche ne correspond pas à une image clé.
Accélérer / Ralentir
# Vitesse 2x (vidéo et audio)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
# Vitesse 0.5x (ralenti)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
# Vidéo uniquement (pas d'audio)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4
Concaténer des Vidéos
# Créer une liste de fichiers
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt
# Concaténer (même codec/résolution)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
# Concaténer avec ré-encodage (sources différentes)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4
Ajouter un Fondu d'Entrée/Sortie
# Fondu d'entrée pendant la première seconde, fondu de sortie pendant la dernière seconde (vidéo 30 ips)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4
# Fondu audio
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4
Obtenir des Informations sur la Vidéo
# Durée, résolution, informations sur le codec
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# Informations complètes
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
Schémas Spécifiques à Remotion
Ajustement de la Vitesse Vidéo pour Remotion
Quand utiliser FFmpeg par rapport à playbackRate de Remotion :
| Scénario | Utiliser FFmpeg | Utiliser Remotion |
|---|---|---|
| Vitesse constante (1.5x, 2x) | Les deux fonctionnent | ✅ Plus simple |
| Vitesses extrêmes (>4x ou <0.25x) | ✅ Plus fiable | Peut avoir des problèmes |
| Vitesse variable (accélération progressive) | ✅ Prétraiter | Solution de contournement complexe |
| Nécessite une synchronisation audio parfaite | ✅ Garanti | Généralement correct |
| Démo doit correspondre à un timing de voix off | ✅ Pré-calculer | Ajustement en temps réel |
Limitation de Remotion : playbackRate doit être constant. L'interpolation dynamique comme playbackRate={interpolate(frame, [0, 100], [1, 5])} ne fonctionnera pas correctement car Remotion évalue les trames indépendamment.
# Accélérer une démo pour l'adapter à une scène (ex : démo de 60s en 20s = vitesse 3x)
ffmpeg -i demo-raw.mp4 \
-filter_complex "[0:v]setpts=0.333*PTS[v];[0:a]atempo=3.0[a]" \
-map "[v]" -map "[a]" \
public/demos/demo-fast.mp4
# Ralenti pour mettre en valeur (vitesse 0.5x)
ffmpeg -i action.mp4 \
-filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \
-map "[v]" -map "[a]" \
public/demos/action-slow.mp4
# Accélérer sans audio (courant pour les enregistrements d'écran)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4
# Effet timelapse (vitesse 10x, supprimer l'audio)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4
Calculer le facteur de vitesse :
- Pour insérer X secondes de vidéo dans Y secondes de scène :
vitesse = X / Y - Multiplicateur setpts =
1 / vitesse(ex : vitesse 3x = setpts=0.333*PTS) - Valeur atempo =
vitesse(ex : vitesse 3x = atempo=3.0)
Vitesse audio extrême (>2x) : Chaînez les filtres atempo (chacun limité à la plage 0.5-2.0) :
# Audio à 4x
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"
# Audio à 8x
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"
Préparer un Enregistrement de Démo pour Remotion
# Standard 1080p, 30 ips, prêt pour Remotion
ffmpeg -i raw-recording.mp4 \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \
-c:v libx264 -crf 18 -preset slow \
-c:a aac -b:a 192k \
-movflags faststart \
public/demos/demo.mp4
Enregistrement d'Écran en Asset Remotion
# À partir d'un enregistrement iPhone/iPad (généralement 60 ips, résolution variable)
ffmpeg -i iphone-recording.mov \
-vf "scale=1920:-2,fps=30" \
-c:v libx264 -crf 20 \
-an \
public/demos/mobile-demo.mp4
Convertir des GIF par Lots
for f in assets/*.gif; do
ffmpeg -i "$f" -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
"public/demos/$(basename "$f" .gif).mp4"
done
Problèmes Courants
"Hauteur non divisible par 2"
Ajoutez le filtre scale : -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
La vidéo ne se lit pas dans le navigateur
Utilisez : -movflags faststart -pix_fmt yuv420p -c:v libx264
L'audio est désynchronisé après un changement de vitesse
Utilisez filter_complex avec atempo : -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]"
Fichier trop volumineux
Augmentez le CRF (23→28) ou réduisez la résolution
Directives de Qualité
| Cas d'Usage | CRF | Preset | Remarques |
|---|---|---|---|
| Archive/Master | 18 | slow | Meilleure qualité, fichiers volumineux |
| Production | 20-22 | medium | Bon équilibre |
| Web/Aperçu | 23-25 | fast | Fichiers plus petits |
| Brouillon/Rapide | 28+ | veryfast | Encodage rapide |
Optimisation de Sortie Spécifique à la Plateforme
Après que Remotion a rendu votre vidéo (généralement dans out/video.mp4), utilisez FFmpeg pour l'optimiser pour chaque plateforme de distribution.
Intégration du Flux de Travail
Rendu Remotion (master) Optimisation FFmpeg Téléchargement sur la plateforme
↓ ↓ ↓
out/video.mp4 ────────→ out/video-youtube.mp4 ───→ YouTube
────────→ out/video-twitter.mp4 ───→ Twitter/X
────────→ out/video-linkedin.mp4 ───→ LinkedIn
────────→ out/video-web.mp4 ───→ Intégration site web
YouTube (Paramètres Recommandés)
YouTube ré-encode tout, alors téléchargez en haute qualité :
# Optimisé YouTube (1080p)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset slow -crf 18 \
-profile:v high -level 4.0 \
-bf 2 -g 30 \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-youtube.mp4
# YouTube Shorts (vertical 1080x1920)
ffmpeg -i out/video.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -crf 18 -c:a aac -b:a 192k \
out/video-shorts.mp4
Twitter/X
Twitter a des limites strictes : max 140s, 512Mo, 1920x1200 :
# Optimisé Twitter (cible moins de 15 Mo pour un téléchargement rapide)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 24 \
-profile:v main -level 3.1 \
-vf "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 128k -ar 44100 \
-movflags +faststart \
-fs 15M \
out/video-twitter.mp4
# Vérifier la taille et la durée du fichier
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4
LinkedIn préfère MP4 avec audio AAC, max 10 minutes :
# Optimisé LinkedIn
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 22 \
-profile:v main \
-vf "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-linkedin.mp4
Site Web/Intégration (Optimisé pour un Chargement Rapide)
# MP4 optimisé pour le web (fichier petit, chargement progressif)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 26 \
-profile:v baseline -level 3.0 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k \
-movflags +faststart \
out/video-web.mp4
# Alternative WebM (meilleure compression, prise en charge navigateur plus large)
ffmpeg -i out/video.mp4 \
-c:v libvpx-vp9 -crf 30 -b:v 0 \
-vf "scale=1280:720" \
-c:a libopus -b:a 128k \
-deadline good \
out/video-web.webm
GIF (pour Aperçus/Miniatures)
# GIF de haute qualité (5 premières secondes)
ffmpeg -i out/video.mp4 -t 5 \
-vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview.gif
# GIF plus petit
ffmpeg -i out/video.mp4 -t 3 \
-vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview-small.gif
Référence Rapide des Exigences de la Plateforme
| Plateforme | Résolution Max | Taille Max | Durée Max | Audio |
|---|---|---|---|---|
| YouTube | 8K | 256 Go | 12 heures | AAC 48 kHz |
| Twitter/X | 1920x1200 | 512 Mo | 140 s | AAC 44.1 kHz |
| 4096x2304 | 5 Go | 10 min | AAC 48 kHz | |
| Instagram Feed | 1080x1350 | 4 Go | 60 s | AAC 48 kHz |
| Instagram Reels | 1080x1920 | 4 Go | 90 s | AAC 48 kHz |
| TikTok | 1080x1920 | 287 Mo | 10 min | AAC |
Export par Lots pour Toutes les Plateformes
#!/bin/bash
# enregistrer sous : export-all-platforms.sh
INPUT="out/video.mp4"
# YouTube (haute qualité)
ffmpeg -i "$INPUT" -c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-youtube.mp4
# Twitter (compressé)
ffmpeg -i "$INPUT" -c:v libx264 -crf 24 \
-vf "scale='min(1280,iw)':'-2'" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-twitter.mp4
# LinkedIn
ffmpeg -i "$INPUT" -c:v libx264 -crf 22 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-linkedin.mp4
# Intégration web (petit)
ffmpeg -i "$INPUT" -c:v libx264 -crf 26 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-web.mp4
echo "Exporté :"
ls -lh out/video-*.mp4
Gestion des Erreurs
Erreurs courantes et correctifs lors du traitement vidéo :
# Vérifier si FFmpeg a réussi
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "Succès" || echo "Échec : vérifiez le fichier d'entrée"
# Valider que le fichier de sortie est lisible
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4
# Obtenir des informations d'erreur détaillées
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20
Gestion des Échecs Courants
| Erreur | Cause | Correctif |
|---|---|---|
| "No such file" | Chemin d'entrée incorrect | Vérifiez le chemin, utilisez des guillemets pour les espaces |
| "Invalid data" | Entrée corrompue | Re-téléchargez ou ré-enregistrez la source |
| "height not divisible by 2" | Dimensions impaires | Ajoutez le filtre scale avec trunc |
| "encoder not found" | Codec manquant | Installez FFmpeg avec les codecs complets |
| Sortie de 0 octets | Échec silencieux | Vérifiez la sortie complète de ffmpeg pour les erreurs |
Commentaires & Contributions
Si cette compétence manque d'informations ou pourrait être améliorée :
- Commande manquante ? Décrivez ce dont vous aviez besoin
- Erreur trouvée ? Faites-moi savoir ce qui ne va pas
- Vous voulez contribuer ? Je peux vous aider à :
- Mettre à jour cette compétence avec des améliorations
- Créer une PR sur github.com/digitalsamba/claude-code-video-toolkit
Dites simplement "améliorer cette compétence" et je vous guiderai dans la mise à jour de .claude/skills/ffmpeg/SKILL.md.