Communitygithub.com

Composição de Vídeo com Python (moviepy)

Componha e edite vídeos em Python puro com moviepy 2.x — sobreponha texto, faixas inferiores e legendas em vídeos, corte e junte clipes, adicione áudio, construa vídeos curtos e determinísticos com um único arquivo build.py. Use quando o usuário precisar de edição de vídeo baseada em Python ou texto determinístico sobre vídeo gerado por IA.

O que é Composição de Vídeo com Python (moviepy)?

Esta skill permite a edição e composição de vídeos utilizando a biblioteca Python moviepy na versão 2.x, ideal para scripts curtos e determinísticos. Ela é útil para desenvolvedores que preferem Python invés de Node ou React, especialmente para sobrepor texto exato em vídeos existentes ou gerados por IA. A skill suporta operações como cortar clipes, adicionar áudio, aplicar efeitos (fade in/out, Ken Burns), e geração de texto sobreposto com fontes personalizadas. O Markdown da skill documenta as mudanças de API da versão 2.x, como o uso de métodos `with_*` e `subclipped`, além de fornecer boas práticas de desempenho, como usar `fps=12` para prévias e `preset='ultrafast'`. Também são abordados problemas comuns e suas soluções, como a importação correta e a necessidade de caminhos de fonte reais para TextClip.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

moviepy (Composição de Vídeo em Python)

Melhor para vídeos curtos e roteirizados e para colocar texto exato sobre gravações. Para vídeos longos, com foco em design e reutilizáveis, prefira Remotion.

Use moviepy quandoUse Remotion quando
O projeto é um único script PythonVocê precisa de componentes React e um sistema de design
Sobrepor texto em clipes existentes ou gerados por IAGráficos animados e diagramas complexos
Edições em lote de muitos arquivosA visualização com recarga automática é importante
Sem disponibilidade de ferramentas NodeVídeos longos e baseados em templates

Configuração

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

Esta skill tem como alvo moviepy 2.x. Sua API difere da 1.x: as importações vêm diretamente de moviepy, e os métodos são with_*/subclipped/resized, não set_*/subclip/resize.

Conceitos Básicos

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

clip = VideoFileClip("in.mp4").subclipped(5, 20)           # trecho de 15 s
clip = clip.resized(height=1080)                            # manter proporção
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")

Sempre chame .close() nos clipes em scripts longos, ou use-os em um bloco with, para liberar os identificadores de arquivo.

Sobreposição de texto (texto determinístico sobre gravações)

titulo = (TextClip(font="C:/Windows/Fonts/arial.ttf",     # caminho real do arquivo de fonte
                   text="Dra. Jane Doe\nCientista Chefe",
                   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 precisa de um caminho de arquivo de fonte (TTF/OTF). Inclua a fonte da marca no projeto.
  • Os tempos dos clipes estão em segundos, relativos ao início do composto.
  • Para texto com muito estilo (pílulas arredondadas, gradientes), renderize um PNG com Pillow e use ImageClip.
  • Mantenha o texto dentro da área segura: pelo menos 5% de cada borda.

Áudio

voz = AudioFileClip("narracao.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)]))

Deixe a narração definir a linha do tempo: defina a duração do clipe como voz.duration + margem, não o contrário.

Padrão ancorado em áudio

cenas = [("cena1.mp3", "intro.png"), ("cena2.mp3", "grafico.png")]
partes = []
for caminho_audio, caminho_imagem in cenas:
    a = AudioFileClip(caminho_audio)
    v = ImageClip(caminho_imagem).with_duration(a.duration + 0.6).with_audio(a)
    partes.append(v)
concatenate_videoclips(partes).write_videofile("out/explicativo.mp4", fps=30)

Efeito Ken Burns em imagens estáticas

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)

Desempenho

  • Visualize com fps=12 e preset="ultrafast"; renderize o final a 30 fps.
  • write_videofile(..., threads=4).
  • Evite lambdas Python por quadro em clipes longos. Pré-processe com FFmpeg quando possível.

Problemas Comuns

ProblemaCausa e solução
ImportError: cannot import name 'editor'moviepy 2 removeu moviepy.editor; importe de moviepy
AttributeError: set_durationUse with_duration; o mesmo para with_start, with_position
O clipe de texto travaPasse um caminho de arquivo de fonte real
Áudio fora de sincronia após junçãoGaranta que todos os clipes compartilhem o mesmo fps; aplique áudio após a concatenação
Renderização lentaReduza a resolução para rascunhos; evite lambdas grandes em 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.

Habilidades Relacionadas