Communitygithub.com

moviepy (Composición de video en Python)

Compón y edita video en Python puro con moviepy 2.x: superpone texto, tercios inferiores y subtítulos sobre metraje, corta y une clips, agrega audio, crea videos cortos con un solo archivo build.py sin necesidad de Node. Úsalo cuando el usuario necesite edición de video basada en Python o texto determinista sobre video generado por IA.

¿Qué es moviepy (Composición de video en Python)?

Este skill proporciona una guía completa y lista para usar para editar videos con la biblioteca moviepy 2.x en Python. Está diseñado para desarrolladores y agentes de IA que necesitan crear videos cortos y programáticos, superponer texto determinista sobre metraje existente o generado por IA, o automatizar flujos de trabajo de edición de video sin depender de herramientas como Node.js o Remotion. El skill cubre la configuración (pip install), la creación y manipulación de clips (recortar, redimensionar, fundir), la superposición de texto con fuentes reales, la mezcla de audio (locución, música), el patrón de anclaje de audio para videos explicativos, el efecto Ken Burns en imágenes fijas y consejos de rendimiento. También advierte sobre errores comunes de la migración de moviepy 1.x a 2.x, como cambios en las importaciones y nombres de métodos. Es ideal para agentes que operan en entornos con Python pero sin Node, y que requieren resultados precisos y repetibles en la composición de video.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace moviepy (Composición de video en Python)?

Ideal para videos cortos y guionizados, y para colocar texto exacto sobre metraje. Para videos largos, con mucho diseño y reutilizables, prefiere Remotion.

Usa moviepy cuandoUsa Remotion cuando
El proyecto es un solo script de PythonNecesitas componentes de React y un sistema de diseño
Superponer texto sobre clips existentes o generados por IAGráficos animados complejos y gráficas
Ediciones por lotes de muchos archivosLa vista previa con recarga en caliente es importante
No hay cadena de herramientas de Node disponibleVideos largos y plantillados

Configuración

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

Este skill está orientado a moviepy 2.x. Su API difiere de la 1.x: las importaciones vienen directamente de moviepy, y los métodos son with_*/subclipped/resized, no set_*/subclip/resize.

Conceptos básicos

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

clip = VideoFileClip("in.mp4").subclipped(5, 20)           # extracto de 15 s
clip = clip.resized(height=1080)                            # mantener aspecto
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/resultado.mp4", fps=30, codec="libx264", audio_codec="aac")

Siempre llama a .close() en los clips en scripts largos, o úsalos en un bloque with, para liberar los manejadores de archivos.

Superposición de texto (texto determinista sobre metraje)

titulo = (TextClip(font="C:/Windows/Fonts/arial.ttf",     # ruta real a un archivo de fuente
                   text="Dra. Jane Doe\nJefa de Ciencias",
                   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, titulo])

Notas:

  • TextClip necesita una ruta de archivo de fuente (TTF/OTF). Incluye la fuente de la marca en el proyecto.
  • Los tiempos de los clips están en segundos, relativos al inicio del compuesto.
  • Para texto con mucho estilo (píldoras redondeadas, degradados), renderiza un PNG con Pillow y usa ImageClip.
  • Mantén el texto dentro del área segura: al menos 5% desde cada borde.

Audio

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

Deja que la voz en off decida la línea de tiempo: establece la duración del clip a voz.duration + padding, no al revés.

Patrón anclado al audio

escenas = [("escena1.mp3", "intro.png"), ("escena2.mp3", "grafica.png")]
partes = []
for audio_path, imagen_path in escenas:
    a = AudioFileClip(audio_path)
    v = ImageClip(imagen_path).with_duration(a.duration + 0.6).with_audio(a)
    partes.append(v)
concatenate_videoclips(partes).write_videofile("out/explicativo.mp4", fps=30)

Ken Burns en imágenes fijas

img = ImageClip("foto.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)

Rendimiento

  • Previsualiza con fps=12 y preset="ultrafast"; renderiza la versión final a 30 fps.
  • write_videofile(..., threads=4).
  • Evita lambdas de Python por fotograma en clips largos. Pre-procesa con FFmpeg cuando sea posible.

Problemas comunes

ProblemaCausa y solución
ImportError: cannot import name 'editor'moviepy 2 eliminó moviepy.editor; importa desde moviepy
AttributeError: set_durationUsa with_duration; igual para with_start, with_position
El clip de texto fallaPasa una ruta real a un archivo de fuente
Audio desincronizado después de unirAsegúrate de que todos los clips compartan el mismo fps; aplica el audio después de la concatenación
Renderizado lentoReduce la resolución para borradores; evita lambdas grandes en resized

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 relacionados