Edición de reel para teléfono
La mayoría de las reglas aquí provienen de un reel real que falló en ese paso primero. references/research.md contiene las razones y las fuentes. references/resolve-ui.md mapea los controles de DaVinci Resolve para manejarlos con uso de computadora.
Algunos casos no han pasado por un reel publicado aún: fuentes HDR, cámara lenta a 30 fps, discurso en cámara, cajas seguras de TikTok y Shorts, y portadas. Sus comandos solo se ejecutaron en clips de prueba. references/other-cases.md los contiene y dice cómo se verificó cada uno. Informa al usuario cuando una edición depende de uno de ellos.
Pipeline: fuente de teléfono, corte y estabilización con ffmpeg, color (DaVinci Resolve o scripts/grade.py para movimientos de todo el fotograma), texto con Remotion, sonido y masterización con ffmpeg.
Antes de cortar
- Lee las reglas de la marca para el cliente, si las hay: palabras prohibidas, línea de contacto, etiquetado de IA y lo que necesita aprobación antes de publicar.
- Revisa cada clip fuente:
python -I scripts/probe_source.py clip.mp4. Reporta rotación, velocidad de fotogramas y si varía, SDR o HDR, etiquetas de color y audio, luego lista lo que el clip necesita antes de cortar. Los clips típicos de teléfono son SDR bt709 a unos 30 o 60 fps. Fuentes HDR, velocidad de fotograma variable y 30 fps necesitan un paso adicional, enreferences/other-cases.md. Conversación de fondo significa que el sonido original permanece silenciado. Si la persona en cámara está hablando al espectador, consulta la sección de discurso del mismo archivo. - Si usas un segundo modelo de IA como revisor, discute la idea con él antes de decidir, luego verifica lo que dice.
references/research.mdlista los tipos de errores que cometió un modelo revisor.
Ritmo
- Una idea por reel. El texto establece la duración, no un número objetivo. Un reel de prueba necesitó 18.6 s porque el cliente no podía terminar de leer a 10.5 s o 13.5 s.
- Calcula 10 caracteres árabes por segundo, contados desde que aparece una línea. Eso es lento a propósito: el espectador también está viendo la imagen en un teléfono.
- Dos revelaciones por toma cuando sea posible, y al menos 1.5 s entre ellas. Las líneas que aparecen juntas cuentan como una revelación.
- El veredicto de un lector nativo sobre el ritmo supera el de cualquier modelo.
- La imagen más fuerte y el texto de gancho están en pantalla en el fotograma 0, sin fundido desde negro.
- Evita una aceleración repentina de 3x. En cambio, aumenta gradualmente a través de un mal momento.
60 fps reproducidos a 0.5x dan fotogramas reales a 30 fps, por lo que no se necesita interpolación. Una fuente a 30 fps no tiene fotogramas de repuesto, así que lee la sección de cámara lenta de references/other-cases.md antes de ralentizar una. Estabiliza a un intermedio de 60 fps, luego reajusta el tiempo:
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabdetect=shakiness=6:accuracy=15:result=x.trf" -f null -
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabtransform=input=x.trf:smoothing=14:zoom=2:optzoom=0:interpol=bicubic,crop=W:H:X:Y,scale=1080:1920:flags=lanczos,fps=60" -an -c:v libx264 -preset veryfast -crf 10 -pix_fmt yuv420p im.mp4
python -I scripts/retime.py im.mp4 c1.mp4 --start 0.4 --frames 99 --keys 0:.5
Ejecuta las rutas de scripts/ desde la carpeta de esta habilidad. ffmpeg necesita los filtros vidstab. Cada clip debe comenzar en el tiempo cero, porque un inicio no cero aparece como fotogramas negros al principio en Resolve. Agrega setpts=PTS-STARTPTS cuando uses -ss con un filtro de tiempo, y verifica start_time con ffprobe.
Una mano que se desvía hacia los últimos fotogramas de una toma estática puede ocultarse manteniendo un fotograma anterior: trim=end_frame=N,setpts=PTS-STARTPTS,tpad=stop_mode=clone:stop_duration=0.6.
Color
Color aquí significa corrección: blancos neutros, piel natural, colores de producto verdaderos, emparejamiento de tomas. Un aspecto creativo va al final y se mantiene pequeño, y los colores del producto aún deben medirse verdaderos después.
Elige la ruta según lo que necesite la toma:
- Solo movimientos de todo el fotograma (un tinte, exposición, contraste, saturación):
scripts/grade.py. Es más rápido y repetible, y los números permanecen en un comando que puedes reejecutar. - Una parte del fotograma necesita su propia corrección (piel bajo diferente luz, un objeto): DaVinci Resolve, por sus Power Windows.
Ambas rutas usan el mismo bucle de medir, ajustar, medir y los mismos objetivos a continuación.
Con grade.py
python -I scripts/grade.py still c1.mp4 1.5 before.png
python -I scripts/measure_grade.py before.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
python -I scripts/grade.py make c1.cube --frame before.png --neutral 40,60,200,220 --white 205 --contrast 1.06 --pivot 0.4 --lift -0.02
python -I scripts/grade.py still c1.mp4 1.5 check.png --lut c1.cube --compare
python -I scripts/grade.py apply c1.mp4 c1g.mp4 --lut c1.cube
--neutral es un parche que debería ser gris o blanco: un mostrador, una pared, papel, una tapa blanca. make iguala sus R, G y B, y --white establece el nivel en el que termina. Elige un parche que esté iluminado uniformemente y no sobreexpuesto. Mira el fotograma --compare a tamaño completo, y mide la mitad graduada, antes de aplicar. Un LUT por toma, porque cada toma tiene su propio tinte.
Agrega --knee 0.85 cuando una ganancia empuja los realces más allá de 250. Usa --denoise light solo en clips con poca luz visiblemente ruidosos, y --sharpen raramente: los teléfonos ya enfocan, y más da halos en bordes y texto.
Una gradación hecha en Resolve puede dejarla como LUT: haz clic derecho en la miniatura del clip en la página de Color, Generar LUT, Cubo de 33 Puntos. grade.py apply --lut luego lo pone en cualquier clip. Un LUT solo contiene movimientos de todo el fotograma, por lo que las ventanas no están en él.
En DaVinci Resolve gratis
Copia los clips en una carpeta simple que Resolve pueda ver (no puede abrir algunas carpetas de datos de aplicaciones y dice "La ruta no existe"). Ponlos en una nueva línea de tiempo y abre el osciloscopio Parade.
Trabaja en este orden, porque cada paso depende del anterior:
- Nodo de balance. Ganancia para el nivel de blanco, Temp para el tinte. Temp positivo calienta. La misma superficie en dos tomas debe coincidir.
- Nodo de contraste. Contraste y Pivot, Lift para negros profundos, un pequeño movimiento de Sat de 5 o menos.
- Nodo de sujeto, solo cuando un movimiento global dañaría otra cosa. Usa una Power Window suave. En el reel de prueba una ventana arregló la piel de una mano y dejó los colores del producto intactos.
- Renderiza, mide, ajusta y repite. Dos pases fueron suficientes.
python -I scripts/measure_grade.py frame.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
Objetivos
- Superficies neutras: R, G y B dentro de aproximadamente 3 a 5. Blanco alrededor de 195 a 215 para un aspecto brillante.
- Tono de piel cerca de 123 grados. Mantenlo natural, porque la línea del vectorscopio es una referencia, no un objetivo.
- Brillo de piel: las guías lo sitúan entre el 40% y el 70% dependiendo de la piel y la escena. Usa ese rango para detectar un error, no como un número a alcanzar.
- Realces por debajo de aproximadamente el 2% de píxeles a 250+.
- Saturación: compara la línea
chromaantes y después. Una corrección debe dejar p95 cerca de donde estaba. Un salto grande significa que la gradación está agregando color que la escena no tenía. - Los colores del producto se mantienen verdaderos cuando el video vende un producto.
- Dos tomas de la misma superficie miden lo mismo.
Qué mueve qué:
- Tinte apenas movió una palma roja. Gamma por canal lo arregló: G arriba, R y B abajo un poco.
- Temp +300 excedió un tinte azul donde +130 era correcto. Empieza pequeño.
Texto árabe en Remotion
assets/reelTemplate.tsx es una plantilla funcional. Mantiene cada bloque de texto como datos y tiene una composición de sonda para la verificación de texto. references/remotion-setup.md cubre comenzar un proyecto desde cero y registrar las composiciones.
Reglas:
- Una tipografía árabe pesada (la plantilla usa Alexandria 800), blanca más un color de acento, sin cajas, una sombra suave.
- Tamaños de 62 a 124 px en un fotograma de 1080x1920. Un teléfono los necesita así de grandes.
- Interlineado 1.5 para árabe. A 1.22 las colas de letras chocan con la línea siguiente.
- Cada letra dentro de x 110-950 y y 220-1475, para que el carril derecho y la barra inferior de Instagram no cubran nada.
whiteSpace: nowrap, para que una línea nunca se rompa por sorpresa.- Gancho en el fotograma 0. Las líneas posteriores aproximadamente 1 s de diferencia, con una subida y desvanecimiento de 6 fotogramas.
- Una banda oscura suave detrás del texto mantiene al sujeto visible debajo de él.
- Las citas de clientes se mantienen palabra por palabra, sin nombre ni foto a menos que el cliente haya aceptado.
- Di lo que el espectador está viendo. No dejes que una etiqueta implique que es la única opción.
Después de cualquier cambio de texto, renderiza los fotogramas de sonda y revísalos:
npx remotion still ReelProbe out/p0.png --frame=0
python -I scripts/check_text.py out/p0.png out/p1.png out/p2.png out/p3.png
Falla cuando la tinta de dos líneas está a menos de 14 px o una letra sale de la caja segura. Un bloque contiene como máximo siete líneas.
Luego verifica el texto contra la imagen real. Renderiza el último fotograma de cada toma, cuando cada línea está en pantalla, y pasa esos fotogramas en el mismo orden:
npx remotion still Reel out/r0.png --frame=119
python -I scripts/check_text.py out/p0.png out/p1.png --real out/r0.png out/r1.png
Cada línea obtiene una cifra de contraste contra la parte más brillante de la imagen alrededor de sus letras, y por debajo de 3.0 falla. En el reel de prueba las líneas de color de acento puntuaron 3.2 a 4.6 y las líneas blancas 5 y más. Una puntuación baja significa una banda más fuerte detrás del texto, o mover el bloque.
La caja predeterminada es la de Instagram. Para un reel que también va a TikTok o Shorts, agrega --platform all. Esas dos cajas provienen de guías de terceros, así que previsualiza la subida en cada aplicación.
Luego mira fotogramas a tamaño completo al final de cada toma. Una hoja de miniaturas oculta colisiones, y las cosas que se mueven detrás del texto solo se muestran a tamaño completo. En el reel de prueba una cuchara cruzó una línea. Un pequeño zoom con un origen de esquina la movió despejada y también recortó un dedo suelto.
Renderizar y sonido
npx remotion render Reel out/reel.mp4 --codec=h264 --crf=15 --muted --color-space=bt709
python -I scripts/beat_offset.py music.ogg --cuts 3.3,6.5,10.3 --length 13.5 --from 0 --to 40
--color-space=bt709 es importante. Sin él, Remotion escribe bt470bg de rango completo con primarias desconocidas.
Corta la música desde el mejor desplazamiento, desvanece los últimos 1.2 s, une con -c:v copy, luego masteriza:
sh scripts/master.sh in.mov out.mp4 -14 0.4 0.75
El último número es el techo del limitador. AAC agrega sobresalto por encima de él, y la cantidad depende de la pista, por lo que el script mide el archivo que escribió e imprime su sonoridad y pico verdadero. Si imprime TOO HOT (pico verdadero por encima de -1 dBTP), ejecútalo de nuevo con 0.7.
Los altavoces de teléfono pierden la mayor parte del sonido por debajo de 300 Hz, así que verifica esa banda:
ffmpeg -hide_banner -nostats -i out.mp4 -vn -af "highpass=f=300:poles=2,highpass=f=300:poles=2,lowpass=f=12000,ebur128" -f null - 2>&1 | tail -12
Apunta a -20 LUFS o más fuerte en esa banda en un master de -14 LUFS. Una pista con graves pesados midió -23.9 y sonó apagada en teléfonos. Dibuja la forma de onda y el espectro también, porque las marcas de tiempo de un modelo revisor no siempre coinciden con ellas.
La música o voz generada por IA necesita la etiqueta de IA de la plataforma. Genera música ligeramente más larga que el reel, porque una pista cortada no puede extenderse limpiamente.
Comprobaciones antes de dar por terminado
- ffprobe muestra
yuv420p, tv, bt709, bt709, bt709, y la duración y el recuento de fotogramas correctos. check_text.pyimprime PASS, con fotogramas--realincluidos.master.shimprimió un pico verdadero en o por debajo de -1 dBTP.- Existe un fotograma de portada si el reel se muestra en una cuadrícula de perfil (
references/other-cases.md). - Mira los fotogramas a tamaño completo tú mismo, incluidos el primer y el último fotograma y el fotograma antes de cada corte.
- Si un modelo revisor ve el mp4 final, dale las decisiones ya tomadas para que no las reabra.
- Indica lo que no se comprobó. Un agente no puede escuchar el audio o ver el archivo en un teléfono.
- Después de reemplazar un archivo que ya está subido en algún lugar, vuelve a subirlo, verifícalo desde el enlace público y actualiza cualquier cosa programada que apunte al archivo antiguo.
La publicación necesita la aprobación del cliente.