Communitygithub.com

montage vidéo Python avec moviepy

Composer et éditer des vidéos en Python pur avec moviepy 2.x – superposer du texte, des tiers inférieurs et des légendes sur des séquences, couper et assembler des clips, ajouter de l'audio, créer des vidéos courtes avec un seul fichier build.py sans Node. À utiliser lorsque l'utilisateur souhaite un montage vidéo basé sur Python ou un texte déterministe superposé à une vidéo générée par IA.

Qu'est-ce que montage vidéo Python avec moviepy ?

Cette compétence permet de composer et d'éditer des vidéos directement en Python grâce à la bibliothèque moviepy 2.x. Elle est idéale pour les projets court terme où l'on souhaite superposer du texte de manière déterministe sur des séquences vidéo existantes ou générées par IA, sans recourir à un outillage Node. La compétence fournit des exemples concrets pour la configuration, les opérations de base (découpage, redimensionnement, fondu), l'ajout de texte (via TextClip avec des polices TTF/OTF), la gestion audio (voix, musique, fondu) et des motifs avancés comme l'ancrage audio ou l'effet Ken Burns sur des images fixes. Elle inclut également des conseils de performance et un tableau des pièges fréquents pour faciliter la transition depuis moviepy 1.x. Compatible avec les environnements Python standard, elle ne nécessite aucun outil Node.js et produit des vidéos au format MP4 prêtes à l'emploi.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/iamaanahmad/agents-video-editing-skills/tree/HEAD/skills/moviepy-python-video

Demander à votre IA préférée

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

Documentation

moviepy (Composition vidéo Python)

Idéal pour les vidéos courtes et scriptées, et pour placer du texte exact sur des séquences. Pour les vidéos longues, lourdes en design et réutilisables, préférez Remotion.

Utilisez moviepy quandUtilisez Remotion quand
Le projet est un script Python uniqueVous avez besoin de composants React et d'un système de design
Superposition de texte sur des clips existants ou générés par IAAnimations graphiques et diagrammes complexes
Éditions par lots sur plusieurs fichiersL'aperçu avec rechargement à chaud est important
Aucune chaîne d'outils Node disponibleVidéos longues et modélisées

Configuration

pip install "moviepy>=2" pillow
# ou : uv add moviepy pillow

Cette compétence cible moviepy 2.x. Son API diffère de la 1.x : les importations viennent directement de moviepy, et les méthodes sont with_*/subclipped/resized, pas set_*/subclip/resize.

Bases

from moviepy import (VideoFileClip, AudioFileClip, ImageClip, TextClip,
                     CompositeVideoClip, CompositeAudioClip, concatenate_videoclips, vfx, afx)

clip = VideoFileClip("in.mp4").subclipped(5, 20)           # extrait de 15 s
clip = clip.resized(height=1080)                            # conserve les proportions
clip = clip.with_effects([vfx.FadeIn(0.5), vfx.FadeOut(0.5)])

joined = concatenate_videoclips([clip, VideoFileClip("b.mp4")], method="compose")
joined.write_videofile("out/result.mp4", fps=30, codec="libx264", audio_codec="aac")

Appelez toujours .close() sur les clips dans les scripts longs, ou utilisez-les dans un bloc with, pour libérer les descripteurs de fichier.

Superposition de texte (texte déterministe sur séquence)

title = (TextClip(font="C:/Windows/Fonts/arial.ttf",     # un chemin de fichier de police réel
                  text="Dr. Jane Doe\nChief Scientist",
                  font_size=56, color="white",
                  stroke_color="black", stroke_width=2,
                  method="caption", size=(900, None))
         .with_start(1.0).with_duration(4.0)
         .with_position(("left", 860))
         .with_effects([vfx.CrossFadeIn(0.3), vfx.CrossFadeOut(0.3)]))

final = CompositeVideoClip([clip, title])

Remarques :

  • TextClip a besoin d'un chemin de fichier de police (TTF/OTF). Incluez la police de la marque dans le projet.
  • Les temps des clips sont en secondes, relatifs au début du composite.
  • Pour un texte fortement stylisé (pilules arrondies, dégradés), générez un PNG avec Pillow et utilisez ImageClip.
  • Gardez le texte dans la zone de sécurité : au moins 5 % de chaque bord.

Audio

voice = AudioFileClip("voiceover.mp3")
music = AudioFileClip("music.mp3").with_effects([afx.MultiplyVolume(0.12), afx.AudioFadeOut(2)])
music = music.with_duration(voice.duration + 1)
final = clip.with_audio(CompositeAudioClip([music, voice.with_start(0.5)]))

Laissez la voix off déterminer la chronologie : définissez la durée du clip sur voice.duration + padding, pas l'inverse.

Motif ancré à l'audio

scenes = [("scene1.mp3", "intro.png"), ("scene2.mp3", "chart.png")]
parts = []
for audio_path, image_path in scenes:
    a = AudioFileClip(audio_path)
    v = ImageClip(image_path).with_duration(a.duration + 0.6).with_audio(a)
    parts.append(v)
concatenate_videoclips(parts).write_videofile("out/explainer.mp4", fps=30)

Effet Ken Burns sur images fixes

img = ImageClip("photo.jpg").with_duration(6)
img = img.resized(lambda t: 1.0 + 0.04 * t).with_position("center")
CompositeVideoClip([img], size=(1920, 1080)).write_videofile("out/kb.mp4", fps=30)

Performance

  • Prévisualisez avec fps=12 et preset="ultrafast" ; effectuez le rendu final à 30 ips.
  • write_videofile(..., threads=4).
  • Évitez les lambdas Python par image sur les longs clips. Prétraitez avec FFmpeg si possible.

Pièges

ProblèmeCause et correctif
ImportError: cannot import name 'editor'moviepy 2 a supprimé moviepy.editor ; importez depuis moviepy
AttributeError: set_durationUtilisez with_duration ; idem pour with_start, with_position
Plantage du clip texteFournissez un chemin de fichier de police réel
Audio désynchronisé après assemblageAssurez-vous que tous les clips partagent le même fps ; appliquez l'audio après la concaténation
Rendu lentRéduisez la résolution pour les brouillons ; évitez les lambdas resized volumineuses

Individual skills in this repo

This repo contains 6 individual skills — each has its own dedicated page.

iamaanahmad/captions-subtitles

Create, edit, translate and burn in captions and subtitles - transcribe speech with Whisper, write SRT/VTT/ASS files, style them, and hard-burn word-highlight captions for Shorts, Reels and TikTok. Use for any captioning, subtitle, transcript or accessibility request.

iamaanahmad/ffmpeg-essentials

Core FFmpeg and ffprobe recipes for trimming, joining, converting, resizing, compressing, speed changes, fades, audio extraction and GIF conversion. Use for any direct media transformation task, or when a video will not play, has odd dimensions, or is out of sync.

iamaanahmad/motion-design-craft

Motion design rules for programmatic and edited video - durations, easing, springs, staggering, read time for on-screen text, beat grids, transitions and visual hierarchy, plus the defaults that make a video look AI-generated. Use when animating scenes, choosing timings, or reviewing a video that feels off.

iamaanahmad/remotion-programmatic-video

Build videos as React code with Remotion - compositions, sequences, springs, interpolation, audio sync, data-driven props, studio preview and rendering to MP4. Use for explainers, product demos, release notes, data charts, branded templates, or any video that should be reproducible from code.

iamaanahmad/screen-recording-demos

Record clean product and web app demos - scripted browser recording with Playwright, cursor and zoom polish, speed ramps, trimming dead time and syncing to narration. Use when the user wants a walkthrough, tutorial, UI demo or release video of a web app, or a repeatable recording.

iamaanahmad/voiceover-tts

Generate and time narration with text-to-speech (ElevenLabs, OpenAI TTS, Kokoro, Piper) or prepare a recorded voice - script prep, per-scene audio files, pacing, pronunciation, cleanup and loudness. Use when the user needs a voiceover, narration, dubbing, or voice cloning guidance.

Skills associés