Communitygithub.com

aminmzadev/ffmpeg-pipeline

Convierte imágenes fijas en vídeo y realiza operaciones multimedia desde la terminal: efecto Ken Burns, crossfades, mezcla de narración, hojas de contacto, extracción de fotogramas, GIFs, normalización de volumen y cambios de velocidad. Útil cuando el usuario desea un vídeo, una presentación de diapositivas, un clip de vista previa, una hoja de contacto de un vídeo, o necesita combinar, recortar o normalizar audio y vídeo.

¿Qué es ffmpeg-pipeline?

ffmpeg-pipeline es una habilidad esencial para asistentes de IA que trabajan con medios audiovisuales. Su función principal es transformar imágenes fijas (generadas o proporcionadas) en vídeos MP4 con movimiento de zoom (Ken Burns), transiciones de crossfade y narración opcional, todo desde la línea de comandos. Además, ofrece una amplia gama de operaciones de "cirugía multimedia": extraer fotogramas, crear hojas de contacto, generar GIFs optimizados, normalizar el volumen de audio a −16 LUFS, cambiar la velocidad del audio sin alterar el tono, y combinar pistas de audio y vídeo. La habilidad requiere `ffmpeg` y `ffprobe`, y puede aprovechar herramientas hermanas como `anon-image` para generar imágenes y `anon-audio` para narración, aunque también acepta archivos locales directamente. Está diseñada para entornos de terminal en Linux y macOS, y se integra de forma natural con flujos de trabajo de agentes de IA como Claude Code, Cursor o Codex. Incluye reglas de decisión claras para relaciones de aspecto (16:9, 9:16, 1:1), duración de tomas, y mezcla de música de fondo, así como manejo automático de casos límite como narraciones más largas o más cortas que el vídeo. También proporciona diagnósticos útiles, como el comando `info` para mostrar metadatos del vídeo final y un comando `probe` para verificar dependencias.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aminmzadev/keyless-agent-skills/tree/main/ffmpeg-pipeline

Preguntar en tu IA favorita

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

Documentación

¿Qué hace ffmpeg-pipeline?

La habilidad de pegamento. Convierte imágenes fijas generadas (o proporcionadas) en un MP4 animado con narración, y realiza las tareas multimedia rutinarias que un agente encuentra constantemente.

Requiere ffmpeg + ffprobe. Necesita anon-image para el modo de generación y anon-audio para --narration; ambos se descubren automáticamente como hermanos, y ambos son opcionales si pasas --images / --audio directamente.

Comandos

ComandoQué hace
videoimágenes fijas (generadas o de --images) → MP4 con movimiento zoompan + crossfades, narración opcional y pista musical
slideshowimágenes existentes → MP4
muxadjuntar una pista de audio a un vídeo, repitiendo/rellenando para ajustar
framesextraer fotogramas cada N segundos
sheethoja de contacto (N fotogramas espaciados uniformemente con marcas de tiempo)
gifGIF recortado, optimizado con paleta, desde cualquier sección
normalizenormalizar el volumen del audio a −16 LUFS
speedcambiar la velocidad del audio sin alterar el tono (atempo encadenado)
inforesumen de ffprobe en una línea
probeverificación de dependencias

Inicio rápido

# todo el pipeline en una sola llamada: 3 tomas generadas, 4 s cada una, narrado
vidkit.py video "un faro en un acantilado de basalto al atardecer, cinematográfico" -o historia.mp4 \
  --shots 3 --seconds 4 --ratio 16:9 \
  --narration "En alguna costa fría, un faro mantiene su vigilia." \
  --voice es-ES-AlvaroNeural

# reutilizar imágenes que ya tienes
vidkit.py video --images fotos/ -o salida.mp4 --seconds 3 --music fondo.mp3

# cirugía multimedia
vidkit.py mux clip.mp4 voz_en_off.mp3 -o final.mp4
vidkit.py sheet final.mp4 -o preview.jpg --cols 4 --count 8
vidkit.py gif final.mp4 -o teaser.gif --start 1 --dur 2.5 --width 480
vidkit.py normalize voz_en_off.mp3 -o limpio.mp3
vidkit.py info final.mp4

Cálculos de tiempo (para que puedas predecir la salida)

Con N tomas de S segundos y un crossfade de 0,8 s:

duración = N*S - (N-1)*0,8

3 × 4 s → 10,4 s. Si la narración es más larga que el vídeo, el vídeo se repite para cubrirla (-stream_loop). Si es más corta, el audio se rellena con silencio para que nunca pierdas el final. Ambos casos se manejan automáticamente — no añadas -shortest por tu cuenta.

Reglas de decisión

  • Relación de aspecto: 16:9 para YouTube/web, 9:16 para Shorts/Reels/TikTok, 1:1 para feeds y miniaturas. Todo se escala para cubrir y luego se recorta, así que las imágenes fuente de cualquier forma sobreviven sin bandas negras.
  • Segundos por toma: 3–4 s es correcto para una imagen fija; más de 6 s de una imagen estática se siente muerto. Si necesitas más duración, añade tomas, no segundos.
  • Pista musical: pasa --music y se mezcla al 12 % por debajo de la voz. No mezcles dos fuentes fuertes; normaliza primero.
  • GIF: mantén el ancho ≤ 480 y la duración ≤ 3 s, o el archivo excede los límites del chat.

Modos de fallo

SíntomaCausaSolución
missing dependency: ffmpegno instaladoapt install ffmpeg (o brew install ffmpeg)
ffmpeg failed: … Invalid argument en zoompandimensiones de origen imparesel filtro ya escala a W*2; si lo editaste, mantén números pares
la salida es silenciosaarchivo de narración faltante/vacíoverifica la ruta; --narration acepta texto o una ruta de audio
salida mucho más corta de lo esperadoaudio más corto que el vídeo y algo añadió -shortestelimínalo; vidkit.py lo rellena en su lugar
contact sheet necesita Pillowno hay Pillowpip install pillow, o usa frames + tu propia hoja

Notas para el agente

  • Renderiza a 720p a menos que el usuario pida más. Es 4× más rápido y nadie nota la diferencia en una pantalla de portátil.
  • Siempre ejecuta info en el artefacto final y cita la duración real, resolución y tamaño al usuario — detecta fallos silenciosos.
  • Entrega la ruta del MP4; no lo incrustes. El archivo es el artefacto.

Skills relacionados