Creación de videos promocionales en código
Resumen
Un video promocional hecho en código (Remotion: componentes de React renderizados fotograma a fotograma). Se basa en cuatro principios:
- Un mapa de sincronización lo controla todo. La imagen, la cámara, la música y los efectos de sonido leen nombres de hits definidos, de modo que reajustar uno los reajusta a todos.
- Seleccionar antes de editar. El director escucha y ve las opciones antes de que el video cambie.
- Previsualizaciones antes de los finales.
- Cada afirmación es fiel al producto.
Reglas de la casa primero: lee las reglas propias del repositorio de videos antes que cualquier otra cosa: su README, su CLAUDE.md, o un archivo house-rules.md en la raíz del repositorio. Estas anulan los valores predeterminados a continuación. house-rules.example.md en esta carpeta es una plantilla para escribir una.
Configuración de un nuevo video
- Un video por rama o worktree, en un repositorio exclusivo de videos, nunca dentro de la aplicación del producto. Cada video tiene su propia carpeta:
src/videos/<nombre>/. - Copia
templates/de esta habilidad en esa carpeta:sections.ts: el mapa de sincronización,HITS,TRACK_BPMfilm-camera.tsx: la cámara 2.5Dshots.ts: la lista de tomasFilm.tsx: el esqueleto de la composición, con el registro deRoot.tsxen su encabezado
- Copia
templates/render.shyscripts/*.pyen la carpetascripts/del repositorio. - Dependencias, fijadas a una versión exacta juntas:
remotion,@remotion/cli,@remotion/motion-blur. Para los scripts de audio:ffmpeg, además denumpyysoundfile. - Una composición renderiza ambos formatos a partir de una prop
format(horizontal 1920x1080, vertical 1080x1920). Cada formato se diseña por separado y nunca con letterbox.
Flujo de trabajo
- Especificación del guion gráfico (usa la habilidad de lluvia de ideas si está instalada). Escríbelo en
docs/.../YYYY-MM-DD-<nombre>-design.md. Verifica cada afirmación en pantalla contra el código del producto y las flags activas, y redáctala como lo hace el producto. - Tablero de selección antes de cualquier edición del video. Muestra voces (con las líneas leídas en voz alta), sonidos de escritura, varias opciones de música, y borradores de aspecto o personajes, cada uno con un código (A1, B4, M1…). Renderiza los borradores visuales como composiciones pequeñas de tablero, publica la página de forma privada y espera las elecciones del director. Nunca elijas una voz, pista o aspecto en silencio.
- Construcción.
- La copia y el tiempo viven en la configuración.
- Las escenas, tomas y sonidos hacen referencia a nombres de
HITS, nunca a números brutos. - Trabajo de cámara: lee
camera.md.
- Previsualización en 720p (
scripts/render.sh <Comp> <format> preview <nombre>-preview-vN-720p). Informa lo que verificaste, lo que no pudiste probar y cualquier cosa que hayas cambiado más allá de la solicitud. - Finales solo después de la aprobación: tamaño completo, ambos formatos. Los renders largos se interrumpen si la máquina se duerme, así que verifica la alimentación primero.
- Confirma en la rama del video. Fusiona o sube solo cuando se te pida. Los videos anteriores deben mantener el render sin cambios.
Reglas de audio
| Regla | Por qué |
|---|---|
Renderiza la imagen silenciada, luego un --codec=wav separado, y luego scripts/mux.py (-15 LUFS más un limitador). | El AAC dentro del render de Remotion retrasa toda la banda sonora 43 ms. |
La música tiene licencia comercial o es generada, y cada archivo se registra en un CREDITS.md. | Algunos paquetes de efectos de sonido "gratuitos" no tienen licencia para uso comercial. |
Para ajustar una pista seleccionada: scripts/beatgrid.py track [bars] [arc] da el BPM y el tiempo fuerte. Establece TRACK_BPM, luego corta la pista con music-edit.py (compases completos, con crossfade en el tiempo fuerte) o fit-track.py (una ventana directa). | El video se reajusta a la pista, no al revés. |
Las voces provienen solo de un TTS con licencia comercial (Kokoro-82M tiene licencia Apache-2.0). Nunca uses say de macOS. | La licencia de say es personal y no comercial. |
| Los efectos de sonido se generan de forma determinista. Añade cada nuevo sonido al final con su propio PRNG. | De lo contrario, cada archivo posterior cambia. |
Nunca llames a Math.random() en un render. Usa hash() de film-camera.tsx. | Un fotograma debe renderizarse igual cada vez. |
QA antes de entregar cualquier cosa
- Verificación de tipos.
- Volumen aproximado de -15 LUFS y pico verdadero por debajo de -1 dBTP (
ffmpeg -af ebur128). El pico bruto del WAV se mantiene por debajo de 0.99, por lo que no hay recorte. - Los efectos de sonido caen en sus fotogramas de hit.
- Cualquier código QR se decodifica tanto a 1080p como a 720p.
- Renderiza imágenes fijas de cada sección cambiada en ambos formatos (Remotion
renderStill) y míralas tú mismo. Los agentes revisores pasan por alto los bordes cortados, y una revisión de un modelo pequeño y rápido no es una revisión oficial.
Errores comunes
| Error | Solución |
|---|---|
| Movimiento vinculado a un fotograma, pulso o segundo bruto | Añade un hit con nombre en sections.ts y haz referencia a él. |
| Un giro o inclinación de cámara que se filtra en tomas posteriores | Las claves se propagan, así que restablece el campo (roll: 0). |
| Finales renderizados antes de la aprobación | Envía primero una previsualización en 720p. |
| Una voz, pista o aspecto que el director nunca escuchó o vio | Ponlo primero en el tablero de selección. |
| Un mp4 de una sola pasada con audio | Imagen silenciada, luego WAV, luego mux. |
Trabajo temporal en /tmp para un video de varios días | El sistema lo limpia. Usa una carpeta real de worktree. |
One-liners de shell con $(...) o bucles rechazados en modo automático | Pon la lógica en un archivo de script. |