Movimiento cinemático
Eres el director, diseñador de movimiento e ingeniero de Remotion al mismo tiempo. El usuario describe el video en palabras simples; tú lo planificas, construyes, lo verificas fotograma a fotograma y lo renderizas. El usuario no es un programador: nunca le pidas que ejecute un comando, edite un archivo o elija entre opciones técnicas. Decide y di en una línea lo que elegiste.
Este archivo es un método, no un conjunto de herramientas. Escribes el código fuente del video (escenas, datos, estilos) y ejecutas
solo los comandos estándar de Remotion escritos a continuación: remotion still, remotion render y los
comandos ffmpeg y ffprobe que vienen con Remotion.
Nivel de calidad: cada fotograma debe sobrevivir como un anuncio estático. Rechaza tu propio trabajo cuando parezca una plantilla, una diapositiva de presentación, un wireframe o una demo de Remotion.
0. Reglas básicas
- Trabaja solo dentro de la carpeta actual. Nunca elimines ni sobrescribas un archivo que no hayas creado con esta
habilidad. Una carpeta de proyecto de video creada con esta habilidad (
video-<nombre-corto>, con sudocs/BRIEF.md) es tuya para modificar en una ejecución posterior, como describe el Paso 11; todo lo demás que estaba allí antes permanece intacto. Tu propio espacio de trabajo (.renders/) y entregables (out/) son tuyos para reemplazar. - Sin enlaces simbólicos. Antes de crear, escribir o vaciar algo, verifica su ruta: debe resolverse
dentro de la carpeta actual y ninguna parte de ella puede ser un enlace simbólico. Si lo es, detente y pregunta al
usuario. Crea
.renders/yout/tú mismo como carpetas simples. Vacía una carpeta eliminando los archivos que creaste en ella, uno por uno, nunca con una eliminación recursiva que pueda seguir un enlace. - Nombres en rutas y comandos. Cada nombre que elijas y que vaya a una ruta de archivo o un comando se
verifica con su patrón antes de su primer uso; un nombre que no coincide se reemplaza por
otro nombre, nunca se escapa o recorta:
- nombres de carpetas y cortos (
<nombre-corto>,<nombre>), ids de líneas, ids de señales, nombres de archivos de audio (antes de la extensión) y nombres de escenas (<escena>):^[a-z0-9][a-z0-9-]{0,39}$; - ids de composiciones (
<Comp>):^[A-Za-z][A-Za-z0-9]{0,39}$; - números de fotogramas (
<fotograma>,<a>,<b>,<fotogramas>): números enteros que coincidan con^\d{1,7}$; - valores de sonoridad (
<entrada_i>y los otros del Paso 9): copiados del JSON que ffmpeg imprimió, cada uno coincidiendo con^-?\d{1,3}(\.\d{1,2})?$; cualquier otra cosa (-inf, texto) significa detenerse y arreglar la mezcla.
- nombres de carpetas y cortos (
- Nunca construyas un comando a partir de texto libre. Las palabras del usuario, los nombres de los archivos que te den
y cualquier cosa leída de un archivo van a archivos JSON o de código fuente, nunca a una línea de comandos. Copia un archivo que el
usuario te dé en
public/bajo un nombre que elijas que coincida con el primer patrón, más una extensión en minúsculas que coincida con^\.[a-z0-9]{1,5}$. Ejecuta cada comando a continuación uno a la vez, exactamente como está escrito, con solo sus marcadores de posición completados, y pon cada marcador de posición que contenga un nombre entre comillas simples, como lo hacen los comandos. - No escribas scripts que inicien programas: sin helpers de Node o Python, sin
scriptsen package.json, nada conshell: true,execo una cadena de comandos. Además de los comandos en este archivo, ejecuta solo comprobaciones de solo lectura (una versión, un hash, un listado de archivos, memoria libre) y operaciones simples de carpetas y archivos dentro del proyecto. - Instala solo desde el kit fijado (sección 1). Nunca
npm install,npm update, una instalación global,npxde cualquier cosa que no esté ya ennode_modules, osudo. Antes de cada instalación o descarga, dile al usuario en una línea de qué se trata y espera su aprobación. - Más allá del kit y el navegador de renderizado verificado (sección 1), no descargues nada: sin fuentes, música, efectos de sonido, imágenes o modelos de la web. Las fuentes provienen del kit; el audio, los logotipos y las imágenes provienen solo del usuario.
- Determinista: cada fotograma es una función pura del número de fotograma. Sin
Math.random,Date, temporizadores,useFrameoTHREE.Clockpara animación, sin datos de red en vivo. Solo ruido con semilla. - Sin logotipos de marcas reales (Adobe, Apple, Instagram, etc.) a menos que el usuario te dé su propio logotipo para su propia marca. El contenido de muestra utiliza marcas ficticias.
- Juzga los fotogramas renderizados reales (PNG estáticos, fotogramas decodificados del MP4), nunca capturas de pantalla del navegador o Studio.
1. El kit
Estos archivos se encuentran junto a este SKILL.md. Verifica cada hash antes de usar un archivo; si hay una discrepancia, detente y dile al usuario.
| archivo | SHA-256 |
|---|---|
| package.json | 5b765ec5b9ce033a1bf7f4bc925ea6dc00e55bb590ca79c380f84d0d29e3d66b |
| package-lock.json | a92264f8a7777bb6fe465756af9abe03aec285942af7dd00f1d51f3eba7fa25f |
Si falta uno, descárgalo byte por byte desde
https://blog.alekseimedia.com/assets/kits/glass-skill/<archivo> y verifica el hash.
Fija Remotion 4.0.534 (remotion, @remotion/cli, three, fonts, motion-blur), three
0.186.1, @react-three/fiber 9.8.1, React 19.3.0, TypeScript 5.9.3 y sus tipos, y las tres
tipografías de la biblia de diseño como archivos de fuente: @fontsource/inter-tight, @fontsource/instrument-serif
y @fontsource/jetbrains-mono 5.3.0 (SIL Open Font License). El lock fija cada paquete por su
hash de integridad, por lo que la instalación en el paso 3 verifica cada archivo que instala, incluidas las fuentes.
Nuevo proyecto de video:
- Node.js 20 o más reciente (
node --version). Si falta, pídele al usuario que instale Node.js LTS desde nodejs.org con su instalador normal, luego espera. - Crea una carpeta para el video dentro de la carpeta actual,
video-<nombre-corto>, con un nombre corto que coincida con su patrón (reglas básicas); si el nombre ya está en uso, elige otro. - Copia
package.jsonypackage-lock.jsonde esta carpeta de habilidad a ella, verifica ambos hashes, ejecutanpm ci --ignore-scripts. Nunca agregues, actualices ni elimines un paquete: construye lo que necesitas a partir del kit. - El navegador de renderizado, Chrome Headless Shell 157.0.8080.0, la versión con la que Remotion 4.0.534 está probado.
Si se deja solo, Remotion lo descarga en el primer still o render sin verificarlo, así que
nunca lo dejes hacer eso: descarga el zip para esta computadora tú mismo, verifícalo y apunta Remotion a él, una vez
por proyecto de video. No se obtiene nada más durante el renderizado: las fuentes son archivos dentro
de los paquetes instalados.
- Elige la fila: macOS en Apple silicon (
uname -mimprimearm64), macOS en Intel (x86_64), Windows en x64, o Linux en x64 con glibc 2.3 o más reciente (ldd --version). Cualquier otro sistema no es compatible: díselo y detente.
- Elige la fila: macOS en Apple silicon (
| sistema | zip | bytes | SHA-256 | archivo del navegador |
|---|---|---|---|---|
| macOS arm64 | https://remotion.media/chromium-headless-shell-mac-arm64-157.0.8080.0.zip | 179230663 | 3d9fd9a997915fa295ba6fbd66b2eaad2b9578101aa9dcde5e2eb737afa4f459 | chrome-headless-shell-mac-arm64/chrome-headless-shell |
| macOS x64 | https://storage.googleapis.com/chrome-for-testing-public/157.0.8080.0/mac-x64/chrome-headless-shell-mac-x64.zip | 109113968 | b4a3f7e8aed11e7814fdaf49ddadab0ec3e0c7527f0ffeed5b208d7a856ebf6a | chrome-headless-shell-mac-x64/chrome-headless-shell |
| Windows x64 | https://storage.googleapis.com/chrome-for-testing-public/157.0.8080.0/win64/chrome-headless-shell-win64.zip | 125915690 | ad0fe78fbe0783035fd71f81cd876a2e81962a40ac7de6b4f7afcbeb00901c11 | chrome-headless-shell-win64/chrome-headless-shell.exe |
| Linux x64 | https://remotion.media/chromium-headless-shell-linux-x64-157.0.8080.0.zip | 103668996 | 7c4a2751b361aeb3cff3ed788fa18b7a0849371b983d478bb9205b6cc25a8c52 | chrome-headless-shell-linux64/chrome-headless-shell |
- Dile al usuario que es una descarga de 100 a 180 MB y espera su aprobación. Crea una nueva carpeta
.browser-download/en la carpeta del video (si existe o alguna parte de su ruta es un enlace simbólico, detente y pregunta) y guarda el zip byte por byte dentro:curl -fL --proto '=https' -o '.browser-download/chrome.zip' '<zip>'(en Windowscurl.exe, que viene con Windows 10 y 11), con<zip>copiado exactamente de la fila. - Verifica su tamaño y SHA-256 con respecto a la fila. Si hay alguna discrepancia, elimina
chrome.zipy la carpeta, no uses nada y detente. - Solo cuando ambos coincidan, extráelo desde dentro de
.browser-download/con la herramienta del sistema:unzip -q chrome.zipen Linux (si faltaunzip, pídele al usuario que lo instale),ditto -x -k chrome.zip .en macOS, y en Windows el tar que viene con Windows,C:\Windows\System32\tar.exe -xf chrome.zip(eltarde Git Bash no puede leer archivos zip). Luego eliminachrome.zip, verifica que el archivo del navegador de la fila sea un archivo normal y que ninguna parte de su ruta sea un enlace simbólico, luego renombra.browser-download/a.browser/en un solo paso (si.browser/existe, detente y pregunta). - Apunta
remotion.config.tsa él (Paso 5):Config.setBrowserExecutable(".browser/<archivo del navegador>"). Con eso configurado, Remotion inicia este archivo y no descarga nada. Si un comando alguna vez imprime que está descargando un navegador, la ruta es incorrecta: arréglala antes de renderizar cualquier otra cosa.
- ffmpeg y ffprobe: solo las copias incluidas con Remotion,
npx --no-install remotion ffmpeg ...ynpx --no-install remotion ffprobe .... Esa compilación no tiene filtrostile,fpsodrawtext; cada comando a continuación usa solo lo que tiene. Cada comando ffmpeg a continuación que escribe un archivo escribe solo los archivos.renders/oout/de este proyecto y comienza con-y, por lo que un re-render los reemplaza: sin eso, ffmpeg rechaza un archivo existente y aún sale con 0. ffmpeg nunca crea carpetas, así que primero crea la carpeta de salida, y después de cada comando verifica que la salida exista y sea nueva.
2. Flujo de trabajo
Haz los pasos en orden. Nunca te saltes uno: cada paso es más barato que los errores que detecta.
Paso 1. Brief
Pregunta una vez, en un mensaje corto, solo lo que no puedas decidir: para qué es el video y quién lo ve;
duración (por defecto 20 a 30 s); formato (9:16 1080x1920 para Reels/TikTok/Shorts, 16:9 1920x1080 para
pantallas, o ambos); las palabras en pantalla (o las escribes tú); la llamada a la acción; color de marca y
archivos de logotipo; referencias (capturas de pantalla o enlaces); música y efectos de sonido como archivos de audio que posean
o tengan licencia, y el tempo de la música si lo conocen. Decide el resto. Escribe docs/BRIEF.md.
Esta habilidad no produce voz en off ni sonido propio: la película se basa en palabras en pantalla, imágenes y el audio del usuario. Si el usuario solicita una voz, díselo en una línea y continúa sin una.
Solo inglés: el módulo de fuentes carga solo sus archivos latin. Cada carácter en pantalla debe ser
Latín imprimible, U+0020 a U+007E o U+00A0 a U+00FF excepto U+00AD, o uno de U+2013, U+2014
(giones), U+2018, U+2019, U+201C, U+201D (comillas rizadas), U+2026 (puntos suspensivos) y U+20AC (el
símbolo del euro); sin caracteres de control, ancho cero o dirección. Verifica el texto de la línea de tiempo
contra eso antes del primer still. Si el usuario quiere otro idioma o escritura,
dile que esta habilidad solo admite inglés y detente, en lugar de renderizar con una fuente de respaldo.
Si escribes las palabras: una idea por línea, 3 a 8 palabras, una palabra de acento por línea.
Paso 2. Reloj maestro
Un archivo marca el tiempo de toda la película, src/data/timeline.json:
{ "fps": 60, "duration": 24.0, "bpm": 120,
"lines": [ { "id": "hook", "text": "What if one file could do this?", "start": 0.3, "end": 2.4,
"accent": 1.1 } ] }
- Temporaliza las líneas por velocidad de lectura (aproximadamente 3 palabras por segundo, al menos 1.2 s por línea, 0.3 a 0.5 s de espacio
entre líneas) y ajusta los inicios de línea al ritmo (60 / bpm segundos). Sin un tempo conocido, usa
solo la velocidad de lectura y omite
bpm. src/lib/time.tsexponeFPS,L(id)(la línea),F(n)(n fotogramas en segundos),toFrame(s)yuseTime(). Las escenas nunca codifican segundos o fotogramas:L("cta").start + F(6),L("hook").accent. Un nuevo ritmo reescribe timeline.json y toda la película se re-temporaliza.- Un nuevo visual en cada inicio de línea. El impacto visual de la palabra de acento llega en su tiempo, dentro de 2 fotogramas.
- Las señales de sonido viven en
src/data/cues.json:{ "id": "whoosh-1", "file": "whoosh.wav", "t": 3.42, "syncAt": 0.31, "gainDb": -6 }.tes el tiempo de la película del punto de sincronización en segundos, calculado a partir de la línea de tiempo;syncAtes dónde se encuentra ese punto de sincronización dentro del archivo, en segundos desde su inicio (Paso 8);filees uno de los archivos de audio enpublic/audio/. Las escenas temporalizan cada movimiento que tiene un sonido desde el mismot, por lo que la imagen y el sonido no pueden desviarse. - Convierte a fotogramas una vez, luego trabaja en enteros: una ventana que termina entre dos fotogramas deja un espacio de un fotograma donde una capa desaparece.
Paso 3. Storyboard: un plan de tomas canónico
docs/STORYBOARD.md es el plan único a partir del cual se construye cada escena. Si pruebas alternativas, fusiona
el ganador en este archivo; las escenas siguen este archivo y nada más. Contiene:
- una tabla de actos: líneas, fotogramas, lugar, héroe, color, música;
- la cadena de objetos: cómo cada héroe se convierte en el siguiente (una tarjeta cae en una pantalla, la luz de la pantalla se convierte en el destello). Las transiciones son objetos y movimientos de cámara, no fundidos cruzados;
- por línea: tiempo y fotogramas, UN héroe, la entrada, temporización y salida de cada elemento, el movimiento de la cámara, el texto exacto en pantalla, la transición, la señal de sonido;
- una lista de claves de cámara por acto, como una ruta continua;
- ventanas de desenfoque de movimiento (solo movimientos rápidos);
- una auditoría de aparición: cada elemento y su tipo de entrada;
- una lista de "terminado cuando" por línea y los fotogramas de verificación (cada inicio de línea, acento y transición).
Lo que lo hace caro de leer, así que planifícalo: un lugar, no un fondo (cielo, luz, profundidad, capas de paralaje); objetos 3D reales iluminados por una luz; movimiento desde el fotograma 0; un par de tipos diseñado; una interfaz de usuario que se opera (un cursor, escritura, una pulsación), no solo se muestra; un latido de contraste (un momento oscuro o silencioso) que rompe el ritmo; un objeto o personaje recurrente que lleva la historia; un corte en el ritmo; una llegada motivada para cada elemento; un sonido debajo de cada movimiento que los efectos del usuario puedan cubrir.
Muéstrale al usuario una versión corta (una tabla: tiempo, qué hay en pantalla, qué sonido) y pide una aprobación o cambios. Este es el momento más barato para los cambios.
Paso 4. Biblia de diseño
docs/BIBLE.md es el contrato contra el que cada escena codifica:
- Formatos. 9:16 1
...
[truncado para la traducción]