Communitygithub.com

Editor de Vídeo

Use quando o usuário quiser editar, criar, cortar, comprimir, mesclar, redimensionar, alterar velocidade, estabilizar, adicionar transições, transcrever, adicionar legendas, criar cartelas de título, barras de identificação, cartelas finais, fazer teasers, extrair miniaturas, criar GIFs, adicionar marcas d'água, manipular áudio ou processar arquivos de vídeo de qualquer forma.

O que é Editor de Vídeo?

Este é um assistente de IA para fluxos de trabalho de vídeo, alimentado por três motores principais: ffmpeg para edição de vídeos existentes (corte, compressão, mesclagem, redimensionamento, velocidade, estabilização, marca d'água, áudio, GIF, miniatura, transições, legendas), Remotion para criação de novo conteúdo de vídeo (cartelas de título, barras de identificação, cartelas finais, teasers, sobreposições animadas) e Whisper para transcrição e geração de legendas. Ele suporta aceleração de hardware no Apple Silicon via `h264_videotoolbox`/`hevc_videotoolbox`, integração de temas com ativos de design de `~/design-assets/color-palettes/`, predefinições de plataforma para YouTube, Instagram, TikTok, Twitter e mais, e cache de espaço de trabalho para o Remotion para evitar repetidos `npm install`. O assistente classifica a intenção do usuário em categorias como edição básica, compressão, mesclagem, redimensionamento, alteração de velocidade, estabilização, transições, legendas, cartelas de título, barras de identificação, cartelas finais, teasers, miniaturas, GIFs, marcas d'água, áudio, informações, pipeline e plataforma, e fornece um fluxo de trabalho guiado para executar comandos ffmpeg e Remotion, garantindo tratamento de colisão de saída e verificação pós-execução. Sua utilidade está em permitir que agentes de IA lidem com tarefas complexas de processamento de vídeo e criação de conteúdo de maneira eficiente, analisando primeiro as ferramentas disponíveis, classificando a solicitação do usuário, construindo e executando comandos apropriados e reportando os resultados.

Funciona com~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ElSalvatore-sys/video-editor-plugin/tree/main/skills/video-editor

Perguntar na sua IA favorita

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

Documentação

O que Editor de Vídeo faz?

Visão Geral

Fluxo de trabalho de vídeo assistido por IA, alimentado por três motores:

  • ffmpeg -- editar filmagens existentes (cortar, comprimir, mesclar, redimensionar, velocidade, estabilizar, marca d'água, áudio, GIF, miniatura, transições, legendas)
  • Remotion -- criar novo conteúdo de vídeo (cartelas de título, barras de identificação, cartelas finais, teasers, sobreposições animadas)
  • Whisper -- transcrição e geração de legendas

Capacidades adicionais:

  • Aceleração de hardware no Apple Silicon via h264_videotoolbox / hevc_videotoolbox
  • Integração de temas com ativos de design de ~/design-assets/color-palettes/
  • Predefinições de plataforma para YouTube, Instagram, TikTok, Twitter e mais
  • Cache de espaço de trabalho para Remotion para evitar repetidos npm install

Quando Usar

Ative em QUALQUER uma destas intenções do usuário:

CategoriaPalavras-chave
Edição básicacortar, aparar, clipe, encurtar, dividir
Compressãocomprimir, reduzir tamanho, encolher, menor, otimizar
Mesclagemmesclar, combinar, concatenar, juntar, costurar
Redimensionamentoredimensionar, escalar, cortar, preencher, proporção, retrato, paisagem, quadrado
Velocidadeacelerar, desacelerar, câmera lenta, timelapse, avanço rápido, reverter
Estabilizaçãoestabilizar, tremer, suavizar, corrigir tremor
Transiçõesdesvanecer, crossfade, dissolver, cortina, transição
Legendaslegenda, subtítulo, SRT, transcrever, fala-para-texto
Cartelas de títulocartela de título, introdução, abertura, texto animado
Barras de identificaçãobarra de identificação, etiqueta de nome, chyron, barra de nome
Cartelas finaiscartela final, encerramento, tela final, fechamento
Teasersteaser, trailer, promo, compilação de destaques, montagem
Miniaturasminiatura, poster, extrair quadro, captura de tela
GIFsGIF, imagem animada, loop, meme
Marcas d'águamarca d'água, sobreposição de logotipo, branding
Áudioáudio, volume, normalizar, sonoridade, mudo, fade in, fade out, mixar, extrair áudio
Informaçõesinfo, detalhes, duração, resolução, codec, bitrate, metadados
Pipelinepipeline, lote, fluxo de trabalho, multi-etapas
PlataformaYouTube, Instagram, TikTok, Twitter, Reels, Shorts

Referência de Comandos

Comandos de Edição (ffmpeg)

ComandoDescriçãoExemplo
/trimCortar um segmento de um vídeo"cortar video.mp4 de 0:30 a 1:45"
/compressReduzir o tamanho do arquivo com controle de qualidade"comprimir para menos de 10MB"
/mergeCombinar vários clipes em um"mesclar clipe1.mp4 e clipe2.mp4 com fade"
/resizeAlterar dimensões, proporção, cortar ou preencher"redimensionar para 1080x1080 quadrado"
/speedAcelerar, desacelerar ou reverter"velocidade 2x" ou "câmera lenta 0.5x"
/stabilizeRemover tremor de câmera (vidstab duas passagens)"estabilizar tremedeira.mp4"
/watermarkSobrepor imagem ou texto no vídeo"adicionar logo.png canto inferior direito"
/audioVolume, normalizar, mixar, fade, extrair, mudo"normalizar áudio para -14 LUFS"
/thumbnailExtrair quadro como imagem"miniatura em 0:15"
/gifCriar GIF animado a partir de segmento de vídeo"GIF de 0:05 a 0:10 a 320px"
/extractExtrair faixas de áudio ou legendas"extrair áudio como mp3"
/infoMostrar metadados do vídeo e detalhes dos fluxos"info video.mp4"

Comandos de Criação (Remotion)

ComandoDescriçãoExemplo
/title-cardCartela de título animada com suporte a tema"cartela de título: Em Breve, tema wad, animação zoom"
/lower-thirdSobreposição animada de nome/título"barra de identificação: João Silva, CEO, estilo moderno"
/end-cardEncerramento animado com CTA e redes sociais"cartela final: Inscreva-se!, @usuario, tema ea"
/teaserMontagem multi-clipe com transições e títulos"teaser da pasta clips/, 30 segundos"

Comandos de Transcrição (Whisper)

ComandoDescriçãoExemplo
/transcribeGerar SRT/VTT a partir de fala"transcrever entrevista.mp4"
/add-captionsTranscrever + queimar legendas no vídeo"adicionar legendas a palestra.mp4"

Orquestração

ComandoDescriçãoExemplo
/pipelineCadeia de processamento multi-etapas"cortar, adicionar cartela de título, comprimir para Instagram"

Fluxo de Trabalho

Passo 1: Verificar Ferramentas Disponíveis

which ffmpeg ffprobe && echo "ffmpeg: ok"
node --version && echo "node: ok"
which whisper && echo "whisper: ok" || echo "whisper: não instalado (legendas precisam de .srt manual)"
ffmpeg -encoders 2>/dev/null | grep videotoolbox && echo "hw accel: ok" || echo "hw accel: não disponível"
ffmpeg -filters 2>/dev/null | grep vidstab && echo "vidstab: ok" || echo "vidstab: não disponível (brew install ffmpeg com --with-libvidstab)"

Se ffmpeg estiver faltando: "Instale com brew install ffmpeg" Se Node.js estiver faltando: "Instale de https://nodejs.org ou brew install node" Se vidstab estiver faltando: "Reinstale ffmpeg com vidstab: brew install ffmpeg --with-libvidstab"

Passo 2: Classificar Solicitação

Intenção do UsuárioMotorCaminho
Editar filmagens existentesffmpegPasso 3a
Criar novo conteúdo de vídeoRemotionPasso 3b
Manipulação de áudiofiltros de áudio ffmpegPasso 3a
Informações/inspeçãoffprobePasso 3a
Pipeline combinadoorquestrar ambosPasso 3c
Publicação em plataformapredefinições de redimensionamento + compressãoPasso 3a
TranscriçãoWhisper + ffmpegPasso 3a

Passo 3a: Caminho ffmpeg

  1. Perguntar pelo(s) arquivo(s) de entrada, se não fornecidos
  2. Inspecionar com ffprobe:
    ffprobe -v quiet -print_format json -show_format -show_streams "<arquivo>"
    
  3. Detecção de aceleração de hardware (macOS Apple Silicon):
    # Verificar suporte a VideoToolbox
    ffmpeg -encoders 2>/dev/null | grep h264_videotoolbox
    # Se disponível, preferir: -c:v h264_videotoolbox -b:v 5M
    # Alternativa: -c:v libx264 -crf 23 -preset medium
    
  4. Tratamento de colisão de saída:
    # Antes de escrever a saída, verificar se o arquivo existe
    # Se "video_cortado.mp4" existir, usar "video_cortado_2.mp4", "video_cortado_3.mp4", etc.
    SAIDA="video_cortado.mp4"
    CONTADOR=2
    while [ -f "$SAIDA" ]; do
      SAIDA="video_cortado_${CONTADOR}.mp4"
      CONTADOR=$((CONTADOR + 1))
    done
    
  5. Construir o comando ffmpeg
  6. Explicar cada flag em português claro
  7. Informar o nome do arquivo de saída (nunca sobrescrever a fonte)
  8. Perguntar: "Devo executar isso?"
  9. Executar, depois verificar:
    # Verificar código de saída
    if [ $? -eq 0 ]; then
      echo "Sucesso"
      ffprobe -v quiet -print_format json -show_format "$SAIDA" | grep -E '"duration"|"size"'
    else
      echo "Erro — verifique a saída do ffmpeg acima"
    fi
    
  10. Relatar caminho da saída + tamanho do arquivo + duração

Convenções de nomenclatura de saída:

ComandoPadrão de Saída
Cortarcortado_<nome_arquivo>
Comprimircomprimido_<nome_arquivo>
Mesclarmesclado_saida.<ext>
Redimensionarredimensionado_<nome_arquivo>
Velocidadevelocidade_<fator>x_<nome_arquivo>
Estabilizarestabilizado_<nome_arquivo>
Marca d'águamarca_dagua_<nome_arquivo>
Legendaslegendado_<nome_arquivo>
Extrair áudio<nome>.mp3
Áudio modificadoaudio_<nome_arquivo>
Extrair legenda<nome>.srt
Miniaturathumb_<nome>_<timecode>.jpg
GIF<nome>.gif

Passo 3b: Caminho Remotion

  1. Verificar se Node.js está instalado
  2. Cache de espaço de trabalho -- reutilizar espaço de trabalho existente:
    ESPACO_TRABALHO="/tmp/remotion-workspace"
    if [ -d "$ESPACO_TRABALHO/node_modules" ]; then
      echo "Reutilizando espaço de trabalho Remotion em cache"
    else
      echo "Criando espaço de trabalho Remotion (primeira execução)..."
      mkdir -p "$ESPACO_TRABALHO"
      cp -r ~/project-templates/remotion-video/* "$ESPACO_TRABALHO/"
      cd "$ESPACO_TRABALHO" && npm install
    fi
    
  3. Carregamento de tema de ~/design-assets/color-palettes/:
    # Se o usuário especificar um tema (wad, bloghead, ea), carregar cores do JSON
    # Passar como inputProps para a composição do Remotion
    
  4. Escrever ou atualizar os arquivos de origem da composição conforme necessário
  5. Composições disponíveis:
    • TitleCard -- título animado com múltiplas predefinições de animação
    • LowerThird -- sobreposição de nome/título com barra de destaque
    • EndCard -- encerramento com CTA, redes sociais, logotipo
    • Teaser -- montagem multi-clipe com TransitionSeries
  6. Renderizar:
    cd "$ESPACO_TRABALHO"
    npx remotion render src/index.ts <CompositionId> /caminho/para/saida.mp4 \
      --props='{"text":"Título","bg":"#09090B","fg":"#FFFFFF","accent":"#7C3AED"}'
    
  7. Copiar saída para o diretório de trabalho do usuário
  8. Relatar caminho da saída + duração

Passo 3c: Pipeline Combinado

Para solicitações multi-etapas (ex.: "crie um teaser com cartela de título, clipes e cartela final"):

  1. Planejar -- descrever cada etapa ao usuário antes de executar
  2. Criar -- gerar qualquer conteúdo Remotion primeiro (cartelas de título, cartelas finais)
  3. Processar -- cortar/redimensionar clipes de origem com ffmpeg
  4. Montar -- mesclar todas as peças com transições usando ffmpeg
  5. Finalizar -- comprimir para a plataforma de destino, se especificado
  6. Confirmar entre as fases principais (criação vs. edição vs. montagem)

Referência Rápida ffmpeg

Cortar (sem perda)

ffmpeg -ss <inicio> -to <fim> -i entrada.mp4 -c copy cortado_entrada.mp4

Comprimir -- web (CRF 23)

ffmpeg -i entrada.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k comprimido_entrada.mp4

Comprimir -- acelerado por hardware (macOS)

ffmpeg -i entrada.mp4 -c:v h264_videotoolbox -b:v 5M -c:a aac -b:a 128k comprimido_entrada.mp4

Mesclar com transição fade

# Dois clipes com crossfade de 1s no offset = duração_do_clipe1 - 1
ffmpeg -i clipe1.mp4 -i clipe2.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]" mesclado_saida.mp4

Redimensionar / Escalar

# Redimensionar para dimensões específicas (manter proporção com -1)
ffmpeg -i entrada.mp4 -vf "scale=1920:1080" redimensionado_entrada.mp4
ffmpeg -i entrada.mp4 -vf "scale=1080:-1" redimensionado_entrada.mp4

# Cortar para quadrado central
ffmpeg -i entrada.mp4 -vf "crop=min(iw\,ih):min(iw\,ih)" cortado_entrada.mp4

# Preencher para proporção alvo (letterbox/pillarbox)
ffmpeg -i entrada.mp4 -vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2:black" preenchido_entrada.mp4

Alteração de Velocidade

# Velocidade 2x (vídeo + áudio)
ffmpeg -i entrada.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" velocidade_2x_entrada.mp4

# Câmera lenta 0.5x
ffmpeg -i entrada.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" velocidade_0.5x_entrada.mp4

# Velocidade 4x (encadear atempo para áudio >2x: atempo máximo é 2.0)
ffmpeg -i entrada.mp4 -vf "setpts=0.25*PTS" -af "atempo=2.0,atempo=2.0" velocidade_4x_entrada.mp4

# Reverter
ffmpeg -i entrada.mp4 -vf "reverse" -af "areverse" revertido_entrada.mp4

Sobreposição de Marca d'Água

# Canto inferior direito com preenchimento
ffmpeg -i entrada.mp4 -i logo.png \
  -filter_complex "overlay=W-w-20:H-h-20" marca_dagua_entrada.mp4

# Canto superior esquerdo
ffmpeg -i entrada.mp4 -i logo.png \
  -filter_complex "overlay=20:20" marca_dagua_entrada.mp4

# Centro com opacidade
ffmpeg -i entrada.mp4 -i logo.png \
  -filter_complex "[1]format=rgba,colorchannelmixer=aa=0.3[wm];[0][wm]overlay=(W-w)/2:(H-h)/2" marca_dagua_entrada.mp4

# Marca d'água de texto
ffmpeg -i entrada.mp4 \
  -vf "drawtext=text='Minha Marca':fontsize=24:[email protected]:x=W-tw-20:y=H-th-20" marca_dagua_entrada.mp4

Estabilização de Vídeo (vidstab duas passagens)

# Passo 1: Analisar movimento
ffmpeg -i tremedeira.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 -f null -

# Passo 2: Aplicar estabilização
ffmpeg -i tremedeira.mp4 -vf vidstabtransform=smoothing=30:input=transforms.trf estabilizado_tremedeira.mp4

Manipulação de Áudio

# Ajustar volume
ffmpeg -i entrada.mp4 -af "volume=1.5" audio_entrada.mp4

# Normalizar sonoridade (padrão de transmissão -14 LUFS)
ffmpeg -i entrada.mp4 -af "loudnorm=I=-14:TP=-1:LRA=11" audio_entrada.mp4

# Mixar duas faixas de áudio
ffmpeg -i video.mp4 -i musica.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_entrada.mp4

# Fade in/out de áudio (3s fade in, 3s fade out)
ffmpeg -i entrada.mp4 -af "afade=t=in:ss=0:d=3,afade=t=out:st=<fim-3>:d=3" audio_entrada.mp4

# Silenciar áudio
ffmpeg -i entrada.mp4 -an mudo_entrada.mp4

# Substituir áudio
ffmpeg -i entrada.mp4 -i nova_faixa.mp3 -c:v copy -map 0:v:0 -map 1:a:0 audio_substituido_entrada.mp4

Criação de GIF (duas passagens de paleta para qualidade)

# Passo 1: Gerar paleta
ffmpeg -ss <inicio> -t <duracao> -i entrada.mp4 \
  -vf "fps=15,scale=320:-1:flags=lanczos,palettegen" paleta.png

# Passo 2: Criar GIF usando paleta
ffmpeg -ss <inicio> -t <duracao> -i entrada.mp4 -i paleta.png \
  -filter_complex "[0:v]fps=15,scale=320:-1:flags=lanczos[v];[v][1:v]paletteuse" saida.gif

# Limpeza
rm paleta.png

Extração de Miniatura

# Quadro único em timestamp
ffmpeg -ss <timestamp> -i entrada.mp4 -frames:v 1 -q:v 2 thumb_entrada_<timestamp>.jpg

# Grade de miniaturas (4x4)
ffmpeg -i entrada.mp4 -vf "fps=1/<intervalo>,scale=320:-1,tile=4x4" grade_thumb_entrada.jpg

Queimar legendas .srt

ffmpeg -i entrada.mp4 -vf "subtitles=legendas.srt:force_style='FontSize=24,PrimaryColour=&H00FFFFFF'" legendado_entrada.mp4

Extrair áudio

ffmpeg -i entrada.mp4 -vn -c:a libmp3lame -q:a 2 saida.mp3

Informações do vídeo

ffprobe -v quiet -print_format json -show_format -show_streams entrada.mp4

Referência Rápida Remotion

Configuração de Espaço de Trabalho em Cache

ESPACO_TRABALHO="/tmp/remotion-workspace"
if [ ! -d "$ESPACO_TRABALHO/node_modules" ]; then
  cp -r ~/project-templates/remotion-video/* "$ESPACO_TRABALHO/"
  cd "$ESPACO_TRABALHO" && npm install
fi

Composição 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 = useCurrent
...

[truncado para tradução]

Habilidades Relacionadas