Que fait Éditeur vidéo ?
Aperçu
Flux de travail vidéo assisté par IA, propulsé par trois moteurs :
- ffmpeg -- éditer les séquences existantes (rogner, compresser, fusionner, redimensionner, vitesse, stabiliser, filigrane, audio, GIF, vignette, transitions, sous-titres)
- Remotion -- créer du nouveau contenu vidéo (cartes-titres, tiers inférieurs, cartes de fin, bandes-annonces, superpositions animées)
- Whisper -- transcription et génération de sous-titres
Capacités supplémentaires :
- Accélération matérielle sur Apple Silicon via
h264_videotoolbox / hevc_videotoolbox
- Intégration de thèmes avec les actifs de conception depuis
~/design-assets/color-palettes/
- Préréglages de plateforme pour YouTube, Instagram, TikTok, Twitter, et plus
- Cache d'espace de travail pour Remotion afin d'éviter les
npm install répétés
Quand l'utiliser
Déclencher sur N'IMPORTE LEQUEL de ces intents utilisateur :
| Catégorie | Mots-clés |
|---|
| Édition de base | rogner, couper, clip, raccourcir, diviser |
| Compression | compresser, réduire la taille, diminuer, plus petit, optimiser |
| Fusion | fusionner, combiner, concaténer, joindre, assembler |
| Redimensionnement | redimensionner, mettre à l'échelle, recadrer, remplir, rapport d'aspect, portrait, paysage, carré |
| Vitesse | accélérer, ralentir, ralenti, timelapse, avance rapide, inverser |
| Stabilisation | stabiliser, tremblant, lisser, corriger les secousses |
| Transitions | fondu, fondu enchaîné, dissolution, transition, wipe |
| Sous-titres | sous-titre, SRT, transcrire, parole-texte, légende |
| Cartes-titres | carte-titre, intro, ouverture, texte animé |
| Tiers inférieurs | tiers inférieur, étiquette-nom, chyron, barre de nom |
| Cartes de fin | carte de fin, outro, écran de fin, fermeture |
| Bandes-annonces | bande-annonce, teaser, promo, compil de meilleurs moments, montage |
| Vignettes | vignette, poster, extraire image, capture d'écran |
| GIFs | GIF, image animée, boucle, meme |
| Filigranes | filigrane, superposition de logo, branding |
| Audio | audio, volume, normaliser, intensité sonore, muet, fondu entrée, fondu sortie, mixer, extraire audio |
| Infos | infos, détails, durée, résolution, codec, débit binaire, métadonnées |
| Pipeline | pipeline, lot, flux de travail, multi-étape |
| Plateforme | YouTube, Instagram, TikTok, Twitter, Reels, Shorts |
Référence des commandes
Commandes d'édition (ffmpeg)
| Commande | Description | Exemple |
|---|
/trim | Couper un segment d'une vidéo | "rogner video.mp4 de 0:30 à 1:45" |
/compress | Réduire la taille du fichier avec contrôle de qualité | "compresser pour faire moins de 10 Mo" |
/merge | Combiner plusieurs clips en un seul | "fusionner clip1.mp4 et clip2.mp4 avec fondu" |
/resize | Changer les dimensions, le rapport d'aspect, recadrer ou remplir | "redimensionner en carré 1080x1080" |
/speed | Accélérer, ralentir ou inverser | "vitesse 2x" ou "ralenti 0.5x" |
/stabilize | Supprimer les tremblements de caméra (vidstab en deux passes) | "stabiliser shaky.mp4" |
/watermark | Superposer une image ou du texte sur la vidéo | "ajouter logo.png en bas à droite" |
/audio | Volume, normaliser, mixer, fondu, extraire, muet | "normaliser l'audio à -14 LUFS" |
/thumbnail | Extraire une image | "vignette à 0:15" |
/gif | Créer un GIF animé à partir d'un segment vidéo | "GIF de 0:05 à 0:10 à 320px" |
/extract | Extraire les pistes audio ou de sous-titres | "extraire l'audio en mp3" |
/info | Afficher les métadonnées vidéo et les détails des flux | "info video.mp4" |
Commandes de création (Remotion)
| Commande | Description | Exemple |
|---|
/title-card | Carte-titre animée avec support des thèmes | "carte-titre : Coming Soon, thème wad, animation zoom" |
/lower-third | Superposition animée de nom/titre | "tiers inférieur : John Doe, PDG, style moderne" |
/end-card | Outro animé avec CTA et réseaux sociaux | "carte de fin : Abonnez-vous!, @handle, thème ea" |
/teaser | Montage multi-clips avec transitions et titres | "bande-annonce depuis le dossier clips/, 30 secondes" |
Commandes de transcription (Whisper)
| Commande | Description | Exemple |
|---|
/transcribe | Générer un fichier SRT/VTT à partir de la parole | "transcrire interview.mp4" |
/add-captions | Transcrire + graver les sous-titres sur la vidéo | "ajouter des sous-titres à talk.mp4" |
Orchestration
| Commande | Description | Exemple |
|---|
/pipeline | Chaîne de traitement multi-étapes | "rogner, ajouter une carte-titre, compresser pour Instagram" |
Flux de travail
Étape 1 : Vérifier les outils disponibles
which ffmpeg ffprobe && echo "ffmpeg : ok"
node --version && echo "node : ok"
which whisper && echo "whisper : ok" || echo "whisper : non installé (les sous-titres nécessitent un fichier .srt manuel)"
ffmpeg -encoders 2>/dev/null | grep videotoolbox && echo "accélération matérielle : ok" || echo "accélération matérielle : non disponible"
ffmpeg -filters 2>/dev/null | grep vidstab && echo "vidstab : ok" || echo "vidstab : non disponible (brew install ffmpeg avec --with-libvidstab)"
Si ffmpeg est manquant : "Installer avec brew install ffmpeg"
Si Node.js est manquant : "Installer depuis https://nodejs.org ou brew install node"
Si vidstab est manquant : "Réinstaller ffmpeg avec vidstab : brew install ffmpeg --with-libvidstab"
Étape 2 : Classifier la demande
| Intent utilisateur | Moteur | Chemin |
|---|
| Éditer des séquences existantes | ffmpeg | Étape 3a |
| Créer du nouveau contenu vidéo | Remotion | Étape 3b |
| Manipulation audio | filtres audio ffmpeg | Étape 3a |
| Information/inspection | ffprobe | Étape 3a |
| Pipeline combiné | orchestrer les deux | Étape 3c |
| Publication sur plateforme | préréglages redimensionnement + compression | Étape 3a |
| Transcription | Whisper + ffmpeg | Étape 3a |
Étape 3a : Chemin ffmpeg
- Demander le(s) fichier(s) d'entrée s'ils ne sont pas fournis
- Inspecter avec ffprobe :
ffprobe -v quiet -print_format json -show_format -show_streams "<fichier>"
- Détection de l'accélération matérielle (macOS Apple Silicon) :
ffmpeg -encoders 2>/dev/null | grep h264_videotoolbox
- Gestion des collisions de sortie :
SORTIE="trimmed_video.mp4"
COMPTEUR=2
while [ -f "$SORTIE" ]; do
SORTIE="trimmed_video_${COMPTEUR}.mp4"
COMPTEUR=$((COMPTEUR + 1))
done
- Construire la commande ffmpeg
- Expliquer chaque option en langage clair
- Indiquer le nom du fichier de sortie (ne jamais écraser la source)
- Demander : "Dois-je exécuter cette commande ?"
- Exécuter, puis vérifier :
if [ $? -eq 0 ]; then
echo "Succès"
ffprobe -v quiet -print_format json -show_format "$SORTIE" | grep -E '"duration"|"size"'
else
echo "Erreur - vérifiez la sortie ffmpeg ci-dessus"
fi
- Rapporter le chemin de sortie + taille du fichier + durée
Conventions de nommage des sorties :
| Commande | Modèle de sortie |
|---|
| Rogner | rogne_<nomfichier> |
| Compresser | compresse_<nomfichier> |
| Fusionner | fusionne_sortie.<ext> |
| Redimensionner | redimensionne_<nomfichier> |
| Vitesse | vitesse_<facteur>x_<nomfichier> |
| Stabiliser | stabilise_<nomfichier> |
| Filigrane | filigrane_<nomfichier> |
| Sous-titres | sous-titres_<nomfichier> |
| Extraction audio | <nom>.mp3 |
| Audio modifié | audio_<nomfichier> |
| Extraction sous-titres | <nom>.srt |
| Vignette | vignette_<nom>_<timecode>.jpg |
| GIF | <nom>.gif |
Étape 3b : Chemin Remotion
- Vérifier que Node.js est installé
- Cache d'espace de travail -- réutiliser un espace de travail existant :
ESPACE_TRAVAIL="/tmp/remotion-workspace"
if [ -d "$ESPACE_TRAVAIL/node_modules" ]; then
echo "Réutilisation de l'espace de travail Remotion en cache"
else
echo "Création de l'espace de travail Remotion (première exécution)..."
mkdir -p "$ESPACE_TRAVAIL"
cp -r ~/project-templates/remotion-video/* "$ESPACE_TRAVAIL/"
cd "$ESPACE_TRAVAIL" && npm install
fi
- Chargement du thème depuis
~/design-assets/color-palettes/ :
- Écrire ou mettre à jour les fichiers source de la composition selon les besoins
- Compositions disponibles :
TitleCard -- titre animé avec plusieurs préréglages d'animation
LowerThird -- superposition nom/titre avec barre d'accent
EndCard -- outro avec CTA, réseaux sociaux, logo
Teaser -- montage multi-clips avec TransitionSeries
- Rendu :
cd "$ESPACE_TRAVAIL"
npx remotion render src/index.ts <IdComposition> /chemin/vers/sortie.mp4 \
--props='{"text":"Titre","bg":"#09090B","fg":"#FFFFFF","accent":"#7C3AED"}'
- Copier la sortie dans le répertoire de travail de l'utilisateur
- Rapporter le chemin de sortie + durée
Étape 3c : Pipeline combiné
Pour les demandes multi-étapes (ex : "créer une bande-annonce avec carte-titre, clips et carte de fin") :
- Planifier -- décrire chaque étape à l'utilisateur avant d'exécuter
- Créer -- générer d'abord tout contenu Remotion (cartes-titres, cartes de fin)
- Traiter -- rogner/redimensionner les clips source avec ffmpeg
- Assembler -- fusionner toutes les pièces avec des transitions en utilisant ffmpeg
- Finaliser -- compresser pour la plateforme cible si spécifiée
- Confirmer entre les phases majeures (création vs. édition vs. assemblage)
Référence rapide ffmpeg
Rogner (sans perte)
ffmpeg -ss <début> -to <fin> -i entree.mp4 -c copy rogne_entree.mp4
Compresser -- web (CRF 23)
ffmpeg -i entree.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k compresse_entree.mp4
Compresser -- accélération matérielle (macOS)
ffmpeg -i entree.mp4 -c:v h264_videotoolbox -b:v 5M -c:a aac -b:a 128k compresse_entree.mp4
Fusionner avec transition fondu
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex "[0][1]xfade=transition=fade:duration=1:offset=<offset>,format=yuv420p[v];[0:a][1:a]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" fusionne_sortie.mp4
Redimensionner / Mettre à l'échelle
ffmpeg -i entree.mp4 -vf "scale=1920:1080" redimensionne_entree.mp4
ffmpeg -i entree.mp4 -vf "scale=1080:-1" redimensionne_entree.mp4
ffmpeg -i entree.mp4 -vf "crop=min(iw\,ih):min(iw\,ih)" recadre_entree.mp4
ffmpeg -i entree.mp4 -vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2:black" rempli_entree.mp4
Changement de vitesse
ffmpeg -i entree.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" vitesse_2x_entree.mp4
ffmpeg -i entree.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" vitesse_0.5x_entree.mp4
ffmpeg -i entree.mp4 -vf "setpts=0.25*PTS" -af "atempo=2.0,atempo=2.0" vitesse_4x_entree.mp4
ffmpeg -i entree.mp4 -vf "reverse" -af "areverse" inverse_entree.mp4
Superposition de filigrane
ffmpeg -i entree.mp4 -i logo.png \
-filter_complex "overlay=W-w-20:H-h-20" filigrane_entree.mp4
ffmpeg -i entree.mp4 -i logo.png \
-filter_complex "overlay=20:20" filigrane_entree.mp4
ffmpeg -i entree.mp4 -i logo.png \
-filter_complex "[1]format=rgba,colorchannelmixer=aa=0.3[wm];[0][wm]overlay=(W-w)/2:(H-h)/2" filigrane_entree.mp4
ffmpeg -i entree.mp4 \
-vf "drawtext=text='Ma Marque':fontsize=24:[email protected]:x=W-tw-20:y=H-th-20" filigrane_entree.mp4
Stabilisation vidéo (vidstab en deux passes)
ffmpeg -i tremblante.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 -f null -
ffmpeg -i tremblante.mp4 -vf vidstabtransform=smoothing=30:input=transforms.trf stabilise_tremblante.mp4
Manipulation audio
ffmpeg -i entree.mp4 -af "volume=1.5" audio_entree.mp4
ffmpeg -i entree.mp4 -af "loudnorm=I=-14:TP=-1:LRA=11" audio_entree.mp4
ffmpeg -i video.mp4 -i musique.mp3 \
-filter_complex "[0:a]volume=1.0[a1];[1:a]volume=0.3[a2];[a1][a2]amix=inputs=2:duration=first[a]" \
-map 0:v -map "[a]" audio_entree.mp4
ffmpeg -i entree.mp4 -af "afade=t=in:ss=0:d=3,afade=t=out:st=<fin-3>:d=3" audio_entree.mp4
ffmpeg -i entree.mp4 -an muet_entree.mp4
ffmpeg -i entree.mp4 -i nouvelle_piste.mp3 -c:v copy -map 0:v:0 -map 1:a:0 remplace_audio_entree.mp4
Création de GIF (palette en deux passes pour la qualité)
ffmpeg -ss <début> -t <durée> -i entree.mp4 \
-vf "fps=15,scale=320:-1:flags=lanczos,palettegen" palette.png
ffmpeg -ss <début> -t <durée> -i entree.mp4 -i palette.png \
-filter_complex "[0:v]fps=15,scale=320:-1:flags=lanczos[v];[v][1:v]paletteuse" sortie.gif
rm palette.png
Extraction de vignette
ffmpeg -ss <instant> -i entree.mp4 -frames:v 1 -q:v 2 vignette_entree_<instant>.jpg
ffmpeg -i entree.mp4 -vf "fps=1/<intervalle>,scale=320:-1,tile=4x4" grille_vignettes_entree.jpg
Graver des sous-titres .srt
ffmpeg -i entree.mp4 -vf "subtitles=sous-titres.srt:force_style='FontSize=24,PrimaryColour=&H00FFFFFF'" sous-titres_entree.mp4
Extraire l'audio
ffmpeg -i entree.mp4 -vn -c:a libmp3lame -q:a 2 sortie.mp3
Infos vidéo
ffprobe -v quiet -print_format json -show_format -show_streams entree.mp4
Référence rapide Remotion
Configuration de l'espace de travail en cache
ESPACE_TRAVAIL="/tmp/remotion-workspace"
if [ ! -d "$ESPACE_TRAVAIL/node_modules" ]; then
cp -r ~/project-templates/remotion-video/* "$ESPACE_TRAVAIL/"
cd "$ESPACE_TRAVAIL" && npm install
fi
Composition TitleCard
import { AbsoluteFill, spring, useCurrentFrame, useVideoConfig, Img } from 'remotion';
type Animation = 'fade' | 'slide-up' | 'slide-down' | 'zoom' | 'typewriter' | 'glitch' | 'blur-in';
export const TitleCard: React.FC<{
text: string;
subtitle?: string;
bg?: string;
fg?: string;
accent?: string;
animation?: Animation;
logo?: string;
}> = ({ text, subtitle, bg = '#09090B', fg = '#FFFFFF', accent = '#7C3AED', animation = 'fade', logo }) => {
const frame = useCurrentFrame();
Référence rapide Whisper
Transcription
whisper "entree.mp4" --model base --output_dir ./transcriptions --language fr
Génération de sous-titres
whisper "entree.mp4" --model base --output_dir ./sous-titres --language fr --task transcribe
Gestion des erreurs
ffmpeg : codec non trouvé
Erreur : Aucun codec trouvé pour le format de sortie spécifié.
Causes possibles : format non pris en charge, ou pilote manquant.
Solution :
- Vérifier le format avec `ffprobe -v quiet -print_format json -show_format <fichier>`
- Utiliser un format courant (mp4, mov, webm)
ffmpeg : fichier non trouvé
Erreur : Impossible d'ouvrir le fichier d'entrée.
Solution : Vérifier que le fichier existe et que le chemin est correct.
Remotion : échec de la compilation
Erreur : Échec de la compilation du fichier source.
Causes possibles : erreur de syntaxe TypeScript, import manquant, ou dépendance cassée.
Solutions :
- Vérifier le message d'erreur pour la ligne spécifique
- Si lié à un import, vérifier que le package est dans package.json
- Si lié à une dépendance, exécuter `npm install` à nouveau
Whisper : fichier audio trop long
Erreur : Le fichier audio dépasse la longueur maximale prise en charge (30 secondes pour le modèle tiny, 60 pour base).
Solution :
- Utiliser un modèle plus grand (`small`, `medium`, `large`)
- Découper l'audio avec ffmpeg : `ffmpeg -i entree.mp4 -vn -c:a pcm_s16le extrait_audio.wav -ss 0 -t 30`
Meilleures pratiques
- Toujours vérifier les outils disponibles avant de commencer tout flux de travail.
- Ne jamais écraser les fichiers source ; utiliser les conventions de nommage de sortie.
- Informer l'utilisateur des options avant d'exécuter des commandes longues ou destructrices.
- Utiliser l'accélération matérielle si disponible pour des rendus plus rapides.
- Pour les pipeline multi-étapes, confirmer chaque phase avant de passer à la suivante.
- Pour la création Remotion, utiliser le cache d'espace de travail pour éviter les téléchargements npm répétés.
- Pour la transcription, spécifier la langue pour une meilleure précision.
- Toujours vérifier le résultat après une opération pour s'assurer du succès.
Exemples de flux de travail
Exemple 1 : Créer une vidéo promotionnelle courte
- L'utilisateur dit : "Crée une bande-annonce de 30 secondes avec une carte-titre, deux clips et une carte de fin"
- L'agent planifie le pipeline
- Phase 1 (Création Remotion) : Générer la carte-titre et la carte de fin
- Phase 2 (Édition ffmpeg) : Rogner les clips source comme spécifié
- Phase 3 (Assemblage) : Fusionner carte-titre + clips + carte de fin avec des fondus
- Phase 4 (Finalisation) : Compresser pour la plateforme cible (ex. TikTok 1080x1920)
- Résultat : Vidéo promotionnelle de 30 secondes avec transitions fluides
Exemple 2 : Ajouter des sous-titres à une interview
- L'utilisateur fournit un fichier : "Ajoute des sous-titres à interview.mp4"
- L'agent vérifie Whisper
- Transcrit la piste audio avec Whisper
- Graver les sous-titres sur la vidéo avec ffmpeg
- Après vérification, l'agent propose de télécharger la vidéo sous-titrée