Communitygithub.com

amrodwaire/phone-reel-edit

Playbook de edición para convertir grabaciones de teléfono en Reels, Shorts o TikToks verticales con texto en árabe en pantalla. Cubre revisión de fuente, corte, estabilización y cámara lenta con ffmpeg, corrección de color por números medidos (un LUT de ffmpeg o DaVinci Resolve gratis), texto árabe en Remotion con superposición automática, zona segura y verificación de contraste, corte de música para las ediciones, masterización de volumen para altavoces de teléfono y comprobaciones previas a la publicación. Úsalo siempre que se corte, recorte o gradúe un video vertical.

¿Qué es phone-reel-edit?

Esta habilidad automatiza y guía el flujo de trabajo completo de edición de video vertical (Reels, Shorts, TikToks) a partir de grabaciones de teléfono, con un enfoque especial en texto en árabe. Es útil porque estandariza pasos que suelen fallar (como la corrección de color basada en mediciones numéricas o la superposición de texto árabe con verificación automática de zona segura y contraste) y porque está diseñada para ser ejecutada por agentes de IA (como Claude Code, Cursor o Codex) que usan herramientas de línea de comandos. El pipeline incluye estabilización y remuestreo a 60 fps con ffmpeg, corrección de color ya sea con un script Python (para ajustes de toda la imagen) o con DaVinci Resolve (para correcciones locales con Power Windows), generación de texto árabe en Remotion con verificación de superposición y contraste, y masterización de audio para altavoces de teléfono. La habilidad también incluye comprobaciones de calidad antes de publicar, como verificar el espacio de color, la integridad del texto y el pico verdadero del audio. Está basada en una documentación detallada que incluye referencias a investigaciones y configuraciones de interfaz de Resolve, y se ejecuta principalmente con comandos de ffmpeg, Python y Remotion.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/amrodwaire/phone-reel-edit/tree/HEAD

Preguntar en tu IA favorita

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

Documentación

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

  1. 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.
  2. 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, en references/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.
  3. Si usas un segundo modelo de IA como revisor, discute la idea con él antes de decidir, luego verifica lo que dice. references/research.md lista 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:

  1. Nodo de balance. Ganancia para el nivel de blanco, Temp para el tinte. Temp positivo calienta. La misma superficie en dos tomas debe coincidir.
  2. Nodo de contraste. Contraste y Pivot, Lift para negros profundos, un pequeño movimiento de Sat de 5 o menos.
  3. 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.
  4. 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 chroma antes 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.py imprime PASS, con fotogramas --real incluidos.
  • master.sh imprimió 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.

Skills relacionados