Communitygithub.com

aelyraAI/ffmpeg

Traitement audio et vidéo avec FFmpeg. Conversion de formats, redimensionnement, compression, extraction audio et préparation d'assets pour Remotion.

Qu'est-ce que ffmpeg ?

Cette compétence fournit un guide complet sur l'utilisation de FFmpeg pour traiter des fichiers audio et vidéo, avec un accent particulier sur les projets de production vidéo comme Remotion. Elle couvre les opérations courantes telles que la conversion de GIF en MP4, le redimensionnement, la compression, l'extraction audio, le découpage, l'accélération/ralentissement, la concaténation et l'ajout de fondus. La compétence inclut également des sections dédiées à l'optimisation pour des plateformes spécifiques (YouTube, Twitter/X, LinkedIn, Web) et des conseils sur la gestion des erreurs courantes. Elle est utile pour tout développeur ou créateur de contenu ayant besoin de préparer des assets vidéo pour des applications web, des présentations ou des intégrations dans des frameworks comme Remotion. Les commandes sont fournies en bash et les paramètres sont expliqués en détail pour garantir une utilisation correcte.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aelyraAI/aelyra-skills/tree/HEAD/ffmpeg

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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 lecteurs
  • scale=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énarioUtiliser FFmpegUtiliser Remotion
Vitesse constante (1.5x, 2x)Les deux fonctionnent✅ Plus simple
Vitesses extrêmes (>4x ou <0.25x)✅ Plus fiablePeut avoir des problèmes
Vitesse variable (accélération progressive)✅ PrétraiterSolution de contournement complexe
Nécessite une synchronisation audio parfaite✅ GarantiGénéralement correct
Démo doit correspondre à un timing de voix off✅ Pré-calculerAjustement 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'UsageCRFPresetRemarques
Archive/Master18slowMeilleure qualité, fichiers volumineux
Production20-22mediumBon équilibre
Web/Aperçu23-25fastFichiers plus petits
Brouillon/Rapide28+veryfastEncodage 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

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

PlateformeRésolution MaxTaille MaxDurée MaxAudio
YouTube8K256 Go12 heuresAAC 48 kHz
Twitter/X1920x1200512 Mo140 sAAC 44.1 kHz
LinkedIn4096x23045 Go10 minAAC 48 kHz
Instagram Feed1080x13504 Go60 sAAC 48 kHz
Instagram Reels1080x19204 Go90 sAAC 48 kHz
TikTok1080x1920287 Mo10 minAAC

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

ErreurCauseCorrectif
"No such file"Chemin d'entrée incorrectVérifiez le chemin, utilisez des guillemets pour les espaces
"Invalid data"Entrée corrompueRe-téléchargez ou ré-enregistrez la source
"height not divisible by 2"Dimensions impairesAjoutez le filtre scale avec trunc
"encoder not found"Codec manquantInstallez FFmpeg avec les codecs complets
Sortie de 0 octetsÉchec silencieuxVé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 à :
    1. Mettre à jour cette compétence avec des améliorations
    2. 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.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills associés