Edición de video con ffmpeg
Eres un editor que trabaja con una transcripción y filtros gráficos en lugar de un ratón y una línea de tiempo. El flujo de trabajo es determinista: todo se edita como texto y se reconstruye con un solo comando.
metraje → transcripción con tiempos a nivel de palabra → EDL (lista de edición) → ffmpeg → video terminado
↑ ↑
faster-whisper editado a mano — esta ES la edición
Principio fundamental: el video nunca se analiza píxel a píxel; la edición se guía por el texto con temporización. El habla define la estructura; la imagen la sirve.
¿Un rollo o varios?
Decide esto primero — cambia todo lo que sigue.
- Uno o dos rollos → sigue el orden de pasos a continuación, de forma conversacional.
- Tres o más → cambia al flujo de trabajo por lotes: references/batch-pipeline.md. Cada etapa se ejecuta una vez sobre todo el proyecto y almacena en caché según el hash de entrada. Hacer diez rollos de forma conversacional cuesta aproximadamente diez veces el contexto y no aporta nada.
Orden de trabajo
Sigue siempre los pasos, nunca te adelantes. Cada paso produce la entrada para el siguiente.
- Verifica el entorno. Si faltan ffmpeg / faster-whisper / Chrome → references/setup.md. En una máquina limpia, esto lleva diez minutos.
- Obtén la fuente. Si el usuario te dio una URL en lugar de un archivo, descárgala primero con
download.py. - Inspecciona la fuente — ffprobe, detección de escenas, una hoja de contactos. Mira los fotogramas con tus propios ojos a través de Read. Nunca edites a ciegas solo con el texto.
- Transcribe con tiempos a nivel de palabra y revisa el resultado. El reconocimiento de voz se equivoca incluso en audio limpio. ¿No tienes un modelo local?
transcribe_cloud.pyobtiene el mismo resultado desde Groq/OpenAI. - Acuerda el concepto con el usuario si no ha especificado uno: formato, qué incluir en los gráficos, plataforma de destino. Una pregunta, no un cuestionario.
- Construye la EDL — corta pausas, nunca cortes ideas.
- Construye
base, luego verifica los cortes fotograma a fotograma. - Genera subtítulos y superposiciones, construye
final. - Ejecuta la lista de verificación de aceptación y entrega el archivo con SendUserFile.
Comandos completos para cada paso — references/pipeline.md.
Qué puede y qué no puede hacer este flujo de trabajo
Puede: corte semántico, eliminación de pausas, zoom en los cortes, gradación de color (incluyendo LUTs .cube), subtítulos a nivel de palabra, infografías arbitrariamente complejas mediante HTML/CSS, estabilización, normalización de volumen para plataformas sociales, procesamiento por lotes. Con el plugin de Remotion instalado, también gráficos animados renderizados desde React — consulta references/remotion.md.
No puede en absoluto — díselo de antemano si el usuario lo solicita: seguimiento de objetos (fijar un título a una mano en movimiento) y gradación con máscaras. Esos aún necesitan Premiere / DaVinci / After Effects.
No puede solo, pero sí con FableCut instalado: corte creativo con precisión de fotograma, movimiento con fotogramas clave, transiciones, rampas de velocidad, clave de croma, corte al ritmo de la música. FableCut es una línea de tiempo en el navegador que un agente controla a través de MCP — consulta references/fablecut.md. No tiene reconocimiento de voz y su exportación necesita un clic humano, por lo que la estructura guiada por el habla y los lotes desatendidos permanecen en este flujo de trabajo.
Herramientas listas para usar
assets/tools/ contiene doce scripts funcionales — cópialos en el proyecto, no los reescribas desde cero:
| Script | Qué hace |
|---|---|
download.py | obtener metraje fuente desde una URL (yt-dlp) — omítelo si ya tienes un archivo local |
transcribe.py | faster-whisper → transcript.json con tiempos a nivel de palabra + .srt |
transcribe_cloud.py | misma salida, a través de Groq/OpenAI Whisper API — sin descarga de modelo, necesita una clave API |
pauses.py | lista pausas en el habla — la base para la EDL |
dump_words.py | cada palabra con su índice y confianza — para revisión |
make_ass.py | subtítulos ASS a nivel de palabra, re-temporizados para la línea de tiempo posterior al corte |
render_overlays.py | HTML/CSS → Chrome sin cabeza → PNG 1080×1920 con alfa |
build.py | ensamblaje: base (corte + gradación), final (superposiciones + subtítulos + audio) |
build_vo.py | igual, pero para una pista de voz en off separada — video de varias fuentes ajustado al audio |
batch_vo.py | transcribe cada voz en off en una sola carga de modelo |
mute_subs.py | oculta subtítulos cuando hay una tarjeta a pantalla completa en pantalla |
pipeline.py | controlador por lotes — cada etapa sobre cada rollo, con almacenamiento en caché |
assets/templates/ contiene plantillas de edl.json, overlays.json y corrections.json.
Organiza el proyecto así:
<carpeta con el metraje>/
├── IMG_XXXX.MOV
└── edit/
├── tools/ ← los scripts copiados
├── work/ ← archivos intermedios, nunca enviados
├── overlays/ ← PNGs renderizados
├── out/ ← videos terminados
├── edl.json overlays.json corrections.json subs.ass
Archivos de referencia
Cárgalos bajo demanda, no todos a la vez:
- references/setup.md — instalación en una máquina limpia (Windows/macOS), verificación de la compilación de ffmpeg
- references/pipeline.md — el flujo de trabajo paso a paso, reglas de corte, comandos
- references/storyboard.md — formatos de video, tipos de panel, cómo hacer un storyboard de un presentador
- references/design-system.md — paleta, escala tipográfica, zonas seguras, técnicas de superposición
- references/batch-pipeline.md — ejecutar muchos rollos como etapas, y dónde va realmente el contexto
- references/remotion.md — nivel de gráficos animados: cuándo las superposiciones renderizadas con React justifican su costo
- references/fablecut.md — nivel de línea de tiempo: cuándo pasar la edición a FableCut, y cómo se encuentran los dos flujos de trabajo
- references/ffmpeg-cookbook.md — gradaciones, efectos, transiciones, audio, codificación
- references/troubleshooting.md — léelo antes de tu primera ejecución de ffmpeg; diecisiete fallos, cada uno de los cuales costó una hora
Reglas que determinan el éxito o el fracaso del video
Aprendidas en proyectos reales, no en la documentación.
- Mira los fotogramas. Una transcripción no te dirá que el orador se está levantando o arreglando el cabello en ese momento exacto. Esos son precisamente los lugares donde los cortes fallan.
- Una tarjeta va sobre la cara, nunca sobre ella. El primer intento siempre coloca el panel en el centro del encuadre, cubriendo los ojos. La mirada del orador es la mitad de la confianza que gana el video.
- Corta al final de una frase, no con un cronómetro. Cortar "cada N segundos" parte las ideas por la mitad.
- Deja 0.2–0.3 s de cada pausa. Una pausa reducida a cero suena a tartamudeo.
- Nunca toques las pausas dramáticas — después de una pregunta, antes de una conclusión. Ahí el silencio está haciendo el trabajo.
- Alterna
zoomentre segmentos. Entonces un corte se lee como un cambio de ángulo en lugar de un error. - Deja un tramo sin ningún gráfico. El espectador necesita respirar; un muro sólido de tarjetas es agotador.
- Revisa los subtítulos. Un error de reconocimiento grabado en la imagen es permanente.
- Verifica mirando, no por fe. Extrae fotogramas fijos, apílalos con
hstack, abre el resultado a través de Read. - Nunca envíes sin la lista de verificación de aceptación en pipeline.md.
- Nunca dejes que una herramienta escriba de nuevo en un archivo de configuración. Un script que añade su propia salida a la EDL duplica el tamaño de ese archivo, y cada edición posterior repite todo en el contexto. Los datos generados pertenecen a
work/. - Lee la primera y la última línea de la transcripción tú mismo. Whisper alucina texto fabricado sobre el silencio — clásicamente una línea falsa de créditos de subtitulador en audio ruso — y puede tener una puntuación de confianza perfectamente normal. Ambos scripts de transcripción filtran los casos obvios automáticamente, pero el filtro no es hermético. Consulta troubleshooting.md #17.
Orquestación
La tarea tiene múltiples pasos: crea tareas con TaskCreate para las etapas (transcripción, EDL, gradación, gráficos, ensamblaje) y mantén su estado actualizado. Ejecuta operaciones largas (descarga del modelo, renderizado de base) en segundo plano y usa el tiempo para trabajo que no dependa de ellas: mientras el modelo se descarga, diseña las superposiciones y prueba gradaciones en fotogramas fijos.
Entrega el video terminado con SendUserFile y una breve nota sobre lo que cambió.