¿Qué hace Visual Guide Video?
Analiza el video y escribe un único archivo de línea de tiempo (timeline.py). El motor renderiza todos los efectos, música y sonidos en código. No se utilizan herramientas de edición externas ni archivos de audio.
SKILL_DIR = carpeta donde se encuentra este SKILL.md. Los scripts se ejecutan con python "$SKILL_DIR/scripts/<name>.py".
0. Preparación
pip install -r "$SKILL_DIR/requirements.txt" # opencv-python imageio-ffmpeg numpy scipy pillow edge-tts
ffmpeg se usa mediante el paquete imageio-ffmpeg. Las fuentes para coreano y emoji se detectan automáticamente del sistema operativo (se pueden especificar con VGUIDE_FONT_BOLD/REGULAR/EMOJI).
La carpeta de trabajo se coloca junto al video: project/timeline.py, resultados en project/build/, project/output/.
1. Identificación del tipo de video → Selección del perfil
python "$SKILL_DIR/scripts/analyze.py" VIDEO --out build/analysis
Observa el Tipo estimado en la consola y las imágenes en build/analysis/sheets/*.jpg. Decide el tipo de video. El PROFILE cambia los valores predeterminados, y los valores escritos en timeline.py siempre tienen prioridad.
| PROFILE | Objetivo | Valores predeterminados | Efectos clave |
|---|---|---|---|
screen | Grabación de pantalla, tutorial, demo | Música pop, audio original desactivado, barra de progreso | SHOTS zoom, CLICKS, LINKS, HIGHLIGHTS, CARDS, HUD, FLOW |
game | Jugabilidad, jefe final, destacados | Música épica (bajo), audio original activado, corrección de color cinematográfica, 30fps | MAGNIFY, IMPACTS, SPEED/FREEZE, POPS, CALLOUTS(@track), análisis de barra de HP |
vlog | Vida diaria, viajes, reseñas | Música chill, audio original activado, corrección de color cálida | CALLOUTS, STICKERS, SPEED (avance rápido), subtítulos, GRADES |
anim | Animación, video de personajes | Música cute, corrección de color vívida | POPS (divertido), STICKERS, CALLOUTS, FREEZE |
promo | Publicidad, promoción, viajes, marca | Música épica (alto), audio original desactivado, 30fps | TYPE (tipografía publicitaria, sello), CLEANUP (borrar texto original), transición INK, GLOWS, LETTERBOX, partículas estacionales, arco de música zen |
Cada tipo define qué explicar:
- screen: "¿Dónde se hace clic y qué cambia?" → zoom en el punto de clic, flechas hacia el panel cambiado, tarjetas de estado.
- game: "¿Qué sucedió (ataque, defensa, impacto, recuperación, patrón del jefe)?" + diversión → sensación de impacto, ventanas emergentes de reacción, lupa para objetivos lejanos, pausa explicativa en momentos clave, avance rápido en secciones aburridas.
- vlog: "¿Dónde y qué se hace?" + emoción → ambiente más que explicación. Los clímax de eventos (cumpleaños, viajes, graduación) se ralentizan y se potencian con partículas; las secciones con movimiento tembloroso se aceleran; los momentos de tomar fotos se congelan con efecto Polaroid; el final es un collage de fotos como outro.
- anim: Énfasis en la reacción del personaje → ventanas emergentes lindas, stickers, congelación de expresiones clave.
- promo: "Que el espectador quiera ir y comprar" → en lugar de subtítulos, copias publicitarias cortas (2 líneas de apertura → título principal → capítulos por escena → tarjeta final). Transiciones características como manchas de tinta al cambiar de escena. Curva de energía musical (tranquilo → creciente → clímax → eco → final). Si el original tiene texto en otro idioma, se elimina y se reemplaza por el idioma objetivo (versión internacional).
Principios de edición comunes (lo que más gusta a los usuarios): Las secciones innecesarias (movimiento, carga, cámara temblorosa) se aceleran, los momentos importantes se congelan para agregar explicación o decoración. En la fase de análisis, cada sección se clasifica como "esencial / de conexión / relleno".
2. Análisis — Cuándo, dónde, qué sucede
Tipos de eventos en events.json:
- Comunes:
cut(cambio de escena),flash(destello),loud(pico de sonido = golpe, explosión),motion(pico de movimiento) - screen:
switch(candidato a clic/toque),big-change,scroll - Barra de HP (
--bar):bar-drop/bar-big-drop(impacto),bar-low(peligro),bar-empty(muerte),bar-rise(recuperación)
En juegos, se debe medir la barra de HP. Los momentos de impacto, recuperación y muerte se identifican con precisión de fotograma.
python "$SKILL_DIR/scripts/crops.py" VIDEO --t 10,30 --box 200,940,500,100 --step 25 --out build/hp.jpg # Medir coordenadas de la barra
python "$SKILL_DIR/scripts/analyze.py" VIDEO --out build/analysis --bar player:337,982,626,988 --bar boss:1015,911,1590,915
- La caja de la barra se define como una sola línea dentro de la barra (altura 4~8px). Para barras blancas usar
light, para barras de color usar:any. - Observa
bar_<nombre>.png(cairograma: vertical = tiempo) y verifica si los eventos coinciden. Si la barra parpadea en rojo al recibir daño o la interfaz desaparece, puede haber falsos positivos. Cruza la verificación congraph.pngy las hojas. - Las hojas tienen intervalos de 2 segundos. En las secciones de combate, extrae fotogramas cada 0.3~0.6 segundos para interpretar qué acción es (ataque/rodar/recibir daño/transformación).
Coordenadas precisas: Mide siempre con recortes de cuadrícula.
python "$SKILL_DIR/scripts/crops.py" VIDEO --t 7.4,13.5 --box 0,760,420,240 --out build/crops.jpg # Área, cuadrícula de 50px
python "$SKILL_DIR/scripts/crops.py" VIDEO --t 12 --full --out build/grid.jpg # Completo, cuadrícula de 100px
3. Escribir timeline.py
Comienza con una receta. Copia la receta correspondiente al tipo de video en timeline.py y solo completa los [valores a rellenar 1] (tiempos, coordenadas, frases de los momentos clave). La estructura de efectos ya está verificada. Luego, con la vista previa, ajusta o agrega elementos según el video.
| Receta | Objetivo | Valores a rellenar |
|---|---|---|
recipes/screen_walkthrough.py | Tutorial de pantalla, demo | Clics (tiempo, coordenadas, frase, lugar cambiado, tarjeta), área a resaltar, subtítulos |
recipes/game_boss_fight.py | Destacados de combate en juegos | Posición de la barra de HP, impactos (tiempo, HP restante), ataque propio, caída del jefe, recuperación, muerte/eliminación, secciones de movimiento, subtítulos explicativos |
recipes/event_vlog.py | Vlog de cumpleaños, aniversario, fiesta | Tiempo y objetivo del clímax, secciones temblorosas, cuenta regresiva de fotos/fotograma congelado, aparición de invitados, última escena |
recipes/promo_shorts.py | Short vertical de 30s (montaje promocional) | Lista de segmentos (segmento original, duración de salida), paneo por escena, palabras estacionales/frases de capítulo, tipo de transición |
recipes/promo_film.py | Película promocional, de viaje | Copia de apertura, tarjeta principal y final, escenas (segmento, velocidad, frase de capítulo, sello, cámara, partículas, energía, sonido de fondo), tiempo de transición de tinta, objeto brillante, texto a borrar |
Los valores predeterminados de las recetas están verificados con videos reales; si se dejan igual, el resultado se verá como el ejemplo (para otros videos, se debe volver a medir). Para elementos que no están en la receta, consulta el esquema completo en templates/timeline_template.py. Si no hay una receta adecuada, comienza con la plantilla.
Guarda timeline.py del video trabajado en la carpeta de ese video. No coloques en el repositorio de la habilidad líneas de tiempo de videos específicos (nombres de personas, escenas personales, contenido del trabajo); los patrones generalizables se trasladan a las recetas y a este documento.
Regla: Los tiempos son siempre del 'video original', las coordenadas son 'píxeles originales'. Aunque SPEED/FREEZE cambien la duración de salida, el motor lo convierte automáticamente.
Para tiempos dentro de una sección congelada, escribe (tiempo original, segundo de desplazamiento de salida): (49.45, 1.6) = la congelación comienza en 49.45 segundos y 1.6 segundos después. Se usa para mostrar ventanas emergentes, Polaroid ou outros, en orden, durante la congelación.
Elementos universales (todos los perfiles)
| Elemento | Uso |
|---|---|
TRIM, SPEED, FREEZE | Recortar sección, velocidad/cámara lenta (etiqueta de badge, si label=None sin badge), pantalla congelada (look desat=para explicación / photo=solo flash de obturador). El avance rápido tiene desenfoque de movimiento automático (SPEED_BLEND) |
TRACKS | Fotogramas clave de objetos en movimiento. auto=True (seguimiento OpenCV: personas, animales) / auto="match" (coincidencia de plantilla: objetos de forma fija como pasteles, letreros, seguimiento con una sola clave hasta until) / follow="padre" (objeto unido al track padre, ej. vela sobre pastel). Se referencia en otros elementos como "@nombre", "@nombre:top" |
PARTICLES | Partículas confetti/hearts/sparkle/bokeh/notes/stars/snow/petals/leaves/fireflies (especificar color como palette=[6]). Desde track/coordenadas con burst (explosión única) o rate (continuo), pantalla completa (at="screen") |
PHOTOS | Mostrar un fotograma original como Polaroid (con pie de foto, ángulo, entrada cayendo). Para collage de pantalla congelada/outro |
SHOTS | Cámara: zoom en coordenadas / "full" / "fill" (llena sin letterbox) / "@track" zoom de seguimiento |
MAGNIFY | Lupa: ampliar objeto lejano en círculo + línea de conexión + etiqueta |
CALLOUTS | Burbuja de diálogo que apunta a un objeto (sigue al track) |
POPS | Texto emergente estilo impact/danger/cool/info/funny/small/party/sweet/count (número de cuenta regresiva) |
STICKERS | Stickers emoji (bob/pulse) |
IMPACTS | Sensación de impacto hit/heavy/crit/damage/block/parry: sacudida+flash+zoom punch+aberración cromática (+ sonido automático) |
SHAKE, FLASH | Sacudida/destello manual |
GRADE, GRADES | Corrección de color cinematic/warm/cool/vivid/mono/sepia/danger/dream/night (transición por sección) |
SFX, SFX_VOLUME | Biblioteca de efectos de sonido: hit boom clang pop ding scratch sad_trombone heartbeat shutter slowmo crash whoosh riser party_horn twinkle confetti / stamp temple_bell ink gliss gliss_down / sonidos de fondo con duración "waves:8" "wind:6" "water:6" "birds:5" |
SOURCE_AUDIO | Sonido original (las secciones en cámara lenta bajan el tono, las congeladas silencio, las de avance rápido reducen el volumen con fast_gain) |
MUSIC | style pop/epic/chill/cute/zen, arc (zen: energía por escena), start (música desde este tiempo), drop, end (+end_fx scratch/fade/cut), volume |
MASTER_GAIN_DB | Ganancia final de la mezcla (antes del limitador). Los videos de teléfonos móviles tienen volumen bajo, por lo que se necesita +3~5 dB |
CUSTOM_LAYERS, CUSTOM_FRAME_FX, CUSTOM_SFX | Efectos nuevos solicitados agregados como funciones dentro de timeline.py (ver más abajo) |
OUTPUT_SIZE, FPS, QUALITY | Resolución de salida (ej. 720p (1280, 720)), fps, CRF |
CANVAS, BACKDROP | Lienzo de diseño. Para shorts verticales: CANVAS = (1080, 1920) + OUTPUT_SIZE = (1080, 1920). El original horizontal se coloca en una banda central y el espacio en blanco se rellena con BACKDROP ("black", "blur", dict(kind="blur", tint=(r,g,b), amount=0.5)). Para llenar la pantalla, usar zoom SHOTS ≈ 3.16 (= 1920 / 607.5) y paneo en x |
SPEED_RAMP | Para unir secciones de velocidad sin espacios (montaje de shorts): las transiciones entre secciones no vuelven a 1x, solo pasan suavemente por este tiempo |
Elementos de publicidad y promoción (scripts/promo.py, usable en todos los perfiles)
| Elemento | Uso |
|---|---|
CLEANUP | Borrar texto, sellos, logotipos del original (t0, t1, (x0,y0,x1,y1), dict(plate=(ta, tb), ref=t)). plate = fotograma sin texto en la misma escena → restaura el fondo tal cual (si la escena tiene paneo/zoom, se corrige automáticamente con correlación de fase). mask="box" reemplaza toda la caja (fondo estático), sin plate se usa inpainting (NS + textura de papel), live=True para texto en movimiento (ej. etiqueta que se desliza, ink="light") |
TYPE | Tipografía publicitaria. "line" (copia que aparece palabra por palabra), "hero" (título grande que aparece juntando espacio entre letras + subtítulo + sello), "chapter" (sello que se imprime y luego aparecen el kicker, la línea decorativa y el título, con veil para un velo de niebla detrás). Las coordenadas son en el lienzo 1920x1080, color color, legibilidad halo |
GLOWS | Resplandor de sol, luna, luz + destello de lente (streak, ghost) — sigue al track |
INK | Transición de mancha de tinta (t, dict(dur, at)): en t cubre la mayor parte de la pantalla y luego se retira desde el centro (sonido automático) |
TYPE "slam" | Para shorts: una palabra grande 'golpea' al ritmo — se dibuja sobre la tinta para que sea visible incluso cuando la pantalla está cubierta (over_ink). Sello seal |
LETTERBOX | Letterbox cinematográfico dict(ratio=2.39, range=(t0, t1)) — entrada y salida suaves. Las partículas también se ocultan debajo de las bandas |
Cuando te pidan un efecto nuevo — Hook personalizado
No modifiques el motor; escribe funciones en timeline.py. ctx contiene t (tiempo de salida), ts (tiempo original), raw (fotograma original), frame (lienzo actual BGR), view, cv (lienzo de superposición), tl, gfx, fx, W, H, screen("@boss"), window(t0, t1) (intervalo de tiempo original → (alpha, progreso)).
def speed_lines(ctx): # CUSTOM_LAYERS: dibujar superposición (sin retorno o nuevo frame)
w = ctx.window(57.2, 58.4)
if w:
x, y = ctx.screen("@boss")
for k in range(12):
a = k / 12 * 6.283
ctx.fx.draw_line(ctx.cv, (x + 300 * math.cos(a), y + 300 * math.sin(a)),
(x + 700 * math.cos(a), y + 700 * math.sin(a)), (255, 255, 255), 3, w[0] * 0.6)
CUSTOM_LAYERS = [speed_lines]
def red_pulse(ctx): # CUSTOM_FRAME_FX: transformar frame → retornar nuevo frame
return ctx.fx._tint(ctx.frame, (255, 0, 0), 0.15) if ctx.window(76, 78) else None
CUSTOM_FRAME_FX = [red_pulse]
def boss_roar(a): # CUSTOM_SFX: a = dict(buf, add, lib, tl, SR)
a["add"](a["buf"], a["lib"]["boom"](), a["tl"].out(14.4), 0.8)
CUSTOM_SFX = [boss_roar]
Los efectos que se usen con frecuencia se trasladan posteriormente a fx.py para convertirlos en elementos oficiales.
Reglas de diseño (basadas en problemas reales)
Comunes
- Los emojis se renderizan en color. Los símbolos como
▸ ✓ ✕pueden mostrarse como □, por lo que se usan emojis (✅ ✖️ 👉 ⏩ ⏸) o• → ·. - Los subtítulos deben tener menos de ~40 caracteres por línea. Las palabras clave se resaltan con
[corchetes]. Para subtítulos explicativos en pantalla congelada, escribe(tf, tf, "...")donde el tiempo de inicio y fin son iguales al tiempo de congelación, para que solo aparezcan durante la pausa. - No superpongas más de 3 ventanas emergentes, burbujas de diálogo o stickers al mismo tiempo. Las ventanas emergentes duran 0.8~1.2 segundos.
screen
- Divide el tiempo entre tarjetas y resaltados para que no se superpongan (tarjeta → resaltado). Las tarjetas deben terminar antes del siguiente zoom de clic.
- Si un resaltado sale del encuadre durante el zoom, se corta → relación de zoom 1.15~1.3.
- Colocación de etiquetas:
"right"(flecha),"above-right"(fila de tabla),"below"(elemento superior). El HUD entra en modo mini (100px a la izquierda) con zoom superior a 1.12x.
game
- Las pantallas ultra-wide (21:9) se colocan en un lienzo 16:9 con letterbox. Las bandas superior e inferior contienen la insignia de velocidad y los subtítulos, sin obstruir la acción. Para llenar la pantalla, usa
"fill"enSHOTS. - Los resaltados de la barra de HP usan
"above|nodim"— si se oscurece la pantalla, no se ve la acción. - El zoom máximo es de 1.3~1.5x. Si la acción es rápida, un zoom excesivo hace que el objeto salga del encuadre. Si se necesita más ampliación, usa
MAGNIFY. - Las congelaciones (FREEZE) duran 1
2 segundos, con 34 veces por video es suficiente. Durante la congelación, usa CALLOUTS para señalar "quién hace qué". - Las secciones de movimiento y carga se reducen con SPEED 2
3x. La cámara lenta (0.30.4x) solo se usa para impactos y golpes decisivos durante 0.5~1 segundo. - Los fotogramas clave del track se registran cada vez que el objeto se mueve significativamente. En los cambios de escena (cortes), escribe el mismo valor dos veces (justo antes y justo después) para evitar interpolaciones bruscas. Verifica con una hoja creada por
python "$SKILL_DIR/scripts/tracks.py" timeline.py. - Usa los eventos de HP para identificar los momentos de impacto y ajusta
IMPACTScon precisión de fotograma. Recibir daño =damage/crit, golpe propio =hit/heavy. - Mantén el sonido original del juego y baja el volumen de la música (0.3~0.45). En el momento de la muerte, usa
MUSIC["end"]+end_fx="scratch"para cortar la música y agrega un efecto de sonido comosad_trombonepara un toque de humor.
promo (publicidad, promoción, versión internacional)
- Para borrar texto original: elige como plate un fotograma al menos 0.4 segundos antes de que aparezca el texto o después de que desaparezca. En fotogramas con fundido, el texto aún es visible tenuemente → verifica con un recorte de alto contraste (sin desenfoque de fondo ×4). Después de borrar, revisa con un recorte de resolución original
--previewpara ver si quedan rastros. - Para fondos que cambian constantemente (niebla, rocío), el plate no es adecuado (produce manchas grises) → usa inpainting sin plate y coloca tipografía de capítulo con
veilen esa zona. - La detección de sellos rojos solo captura rojo intenso (excluye cielos anaranjados). Si el cielo es anaranjado, verifica que el cuadro completo no cambie de color.
- Las copias deben ser cortas: apertura de 2
4 palabras × 2 líneas, títulos de capítulo de 25 palabras, tarjeta final con marca + una línea. No uses eslóganes oficiales de instituciones o marcas reales. - La tipografía se coloca dentro del letterbox (excepto 140px arriba y 140px abajo). El lugar donde estaba el texto original suele ser un 'cielo vacío', ideal para colocar capítulos.
- Música: zen usa
arcpara definir la energía por escena. Ajusta la velocidad de la escena para que el tiempo de la transición de tinta caiga en el límite del compás (80 BPM = 3 segundos), para que la transición, el tambor y el sello coincidan con el ritmo (usatl.loadpara ver el tiempo de salida → ajustar velocidad). El volumen por etapa debe tener una diferencia grande, como calm −20 / peak −12 dB, para que el clímax se sienta. - Las escenas clave (biombo narrativo, amanecer) van a 0.75
1x, los paisajes lentos a 1.52.4x. Usa la mancha de tinta solo para transiciones de grandes partes (estación, región); dentro de la misma parte, conserva la transición original. - Shorts verticales (30s) (
recipes/promo_shorts.py): 96 BPM (un compás de 2.5s) por escena. UsaSEGMENTS = [(inicio original, fin, duración de salida)]para unirlos y calcula la velocidad inversamente conRemappara que las transiciones caigan exactamente en el compás. Las transiciones originales (crossfade) se comprimen a 0.2s y se ocultan bajo la mancha de tinta o el flash.- El primer segundo es el anzuelo: una línea de copia → compás 1 con el título de la marca + impacto musical. La apertura y el final usan diseño de bandas (original en el centro + tipografía arriba y abajo); el cuerpo principal usa recorte vertical completo + paneo hacia el sujeto (sol, cascada, luna en el centro; paisajes amplios de izquierda a derecha).
- En las secciones de avance rápido, el tiempo original se acorta, por lo que los tiempos de la tipografía se escriben en tiempo de salida como
(TRIM[0], segundo de salida). Los capítulos aparecen rápido conpace=0.55. - Las partículas se cortan con
clip=Truejunto con el corte (para que los pétalos no pasen a la siguiente estación). Para evitar la interfaz de los shorts, la tipografía se coloca dentro de los 260px superiores y 420px inferiores.
vlog (videos familiares, de eventos)
- Los videos de teléfonos móviles tienen mucho movimiento. Las secciones con movimiento tembloroso se aceleran 3~4x (el desenfoque de movimiento automático lo suaviza), y el sonido original se reduce automáticamente.
- El clímax (apagar velas, brindis, gol) se pone en cámara lenta 0.4x + flash + confetti burst + party_horn. La música comienza en ese momento (
MUSIC["start"]) — antes, se mantiene el sonido original (canción de cumpleaños, conversación). - Las escenas de tomar fotos se congelan (
look="photo") en el fotograma estable justo después de presionar el obturador y se muestra un Polaroid. Verifica que el fotograma congelado sea nítido con la vista previa (los fotogramas con cámara en movimiento son borrosos). - No coloques stickers, ventanas emergentes ni corazones sobre las caras. Mide las coordenadas de las caras y colócalos a un lado o en espacios vacíos arriba. Para señalar expresiones (sacar la lengua, guiño), usa CALLOUTS (
ring=False) desde un lado. - Si la cuenta regresiva es visible en pantalla (temporizador del teléfono), sincroniza las ventanas emergentes
count3·2·1 en ese momento y agrega el sonido de pop. - El outro consiste en un collage de 2~3 Polaroids sobre una pantalla congelada + una frase corta de felicitación (sube con
topdeOUTROystats=[]). - Para que la historia se entienda incluso sin subtítulos ni narrador: un título de introducción + una breve ventana emergente por escena es suficiente.
4. Vista previa iterativa
python "$SKILL_DIR/scripts/build.py" timeline.py --preview 3.5,7.4,26 # Tiempo original
python "$SKILL_DIR/scripts/build.py" timeline.py --preview-out 16.6,36.2 # Tiempo de salida (verificar congelación/cámara lenta)
Observa build/preview/sheet*.jpg y corrige superposiciones, recortes, occlusiones, errores de coordenadas, texto ilegible. Las etiquetas src ↔ out también muestran la conversión de tiempo. Las secciones congeladas no se pueden verificar con el tiempo original, así que usa --preview-out.
5. Audio
- Música de fondo
MUSIC["style"]: pop (pop electrónico 126BPM), epic (taiko, cuerdas staccato, metales, coro 96BPM), chill (lofi 82BPM), cute (marimba, pizzicato 132BPM), zen (gayageum, daegeum, janggu, buk, coro 80BPM,MUSIC["arc"] = [(tiempo original, "calm|flow|pulse|build|peak|hush|finale")]). Excepto zen, todos tienen estructura intro → A → B → build → drop → outro, y el clímax ocurre en el segundodrop. - Sonido original: activado por defecto en game/vlog/anim. Si hay narrador, se ducca automáticamente (
SOURCE_AUDIO["duck"]). - Verificación de nivel: En los juegos, el sonido original es el protagonista. Mide el RMS de cada sección para que la música esté 3~5 dB por debajo del original, y los efectos de sonido solo se escuchen en el momento del impacto.
import tl, music, build; t = tl.load("timeline.py"); m = music.build_music(t)[0] * t.music["volume"]; s = build.source_audio(t, m.shape[1]) - Narrador (opcional)
NARRATION = [(t, "frase")](si no se especifica, lee los subtítulos).--voice edge(red neuronal de Microsoft, en línea — se informa que las frases se envían a Microsoft) /--voice sapi(Windows offline). Si enbuild/voice_report.jsonla tasa supera el +15% o hay overflow, acorta la frase (coreano ≈ 7 sílabas/segundo).
6. Renderizado final y verificación
python "$SKILL_DIR/scripts/build.py" timeline.py [--voice edge] [--workers 8]
Divide los fotogramas y los renderiza en paralelo con múltiples procesos, luego los une (1 minuto 1080p ≈ 2~3 minutos, 8 workers). Ejecutar en segundo plano.
Verificaciones antes de finalizar
- La última línea
[done] ... Ns (expected Ns), N MBdebe mostrar que la duración coincide y no hay Traceback en el registro. - Extrae algunos fotogramas de la salida para verificar:
ffmpeg -ss T -i out.mp4 -frames:v 1 f.png - Como no se puede escuchar la música ni los efectos de sonido directamente, verifica con RMS de la sección y pide al usuario que los escuche.
Estructura de archivos
| Archivo | Función |
|---|---|
scripts/analyze.py | Metadatos, estimación de tipo, cambio de escena, picos de sonido, eventos de barra, gráficos, hojas |
scripts/crops.py | Recortes de coordenadas originales con cuadrícula |
scripts/tracks.py | Seguimiento de objetos (interpolación de fotogramas clave, OpenCV), hoja de verificación |
scripts/remap.py | Remapeo de tiempo (TRIM, SPEED, FREEZE) |
scripts/build.py | Vista previa / mezcla de audio (remapeo de sonido original, limitador) / renderizado en paralelo / SRT |
scripts/tl.py | Cargador de timeline.py, valores predeterminados del perfil, conversión de coordenadas y tiempo |
scripts/render.py | Cámara (seguimiento, sacudida), capas de grabación de pantalla, hooks personalizados |
scripts/fx.py | Efectos universales: corrección de color, impacto, lupa, burbuja de diálogo, ventana emergente, sticker, badge, ... |
... (truncado para la traducción)
El resto del documento continúa con una descripción detallada de todos los parámetros, ejemplos y mejores prácticas.