Edición de vídeo grabado
Recetas para piezas construidas sobre grabaciones. Se insertan en el bucle de montagent en el paso de construcción; carga montagent primero si no lo has hecho. Para una cabeza parlante, un clip de presentador o un corte de entrevista, abre la estructura de cabeza parlante antes de planificar.
Empezar desde la grabación
Antes de escribir un elemento, probe (sondear) cada clip: su tamaño, fotogramas por segundo, duración y si tiene sonido. Luego planifica la pieza sobre la voz. Sus marcas de tiempo de palabras son el reloj del que cuelgan cada subtítulo, señal y reducción de volumen, por lo que las marcas de tiempo se verifican primero (ver Subtítulos).
Para elegir un momento de un clip largo (el tramo de una grabación de pantalla para mostrar en un inserto, por ejemplo), coloca el clip solo en un proyecto de prueba y llama a frame --from 0 --to <su duración> --infill-ceiling <ms>, con el techo en una vigésima parte de la duración. Una llamada da una baldosa etiquetada cada pocos segundos; frame --at en cualquier baldosa que quieras ver más de cerca.
Recetas
Cada receta da rangos iniciales, no respuestas. Cada una termina en un paso de verificación: carga montagent-craft, luego mira donde dice el paso antes de continuar.
Colocar la grabación
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#FF5A36", "duration": 6000, "output": "out/presenter.mp4",
"tracks": [
{"name": "presenter", "layer": 10, "elements": [
{"id": "presenter", "type": "video", "start": 0, "end": 6000, "source": "media/clip.mp4", "source_start": 0, "source_end": 6000, "x": 540, "y": 2160, "origin": "bottom-center", "width": 3413, "height": 1920, "fit": "cover", "effects": [{"name": "chroma", "color": "#00FF00", "tolerance": 0.2, "softness": 0.08, "spill": 0.9}]}
]}
]
}
- Grabación ancha en un marco alto: haz que el elemento tenga la altura del marco y el ancho que dé la relación de aspecto de la fuente (1920 de alto son 3413 de ancho para 16:9), luego deslízalo lateralmente para mantener al orador centrado.
- Ojos: 25-35 % hacia abajo del marco. Baja el
bottom-centerdel elemento más allá del borde inferior del marco para llegar allí; cortar las piernas es normal. - Espacio sobre la cabeza: 4-8 % de la altura del marco por encima del cabello.
- Una toma más corta que la pieza:
"overrun": "hold"congela su último fotograma. Mantén la congelación bajo medio segundo, o termina la pieza antes. - Un fotograma congelado dentro de un clip, una rampa de velocidad o una inversión: escribe
source_timeen lugar desource_startysource_end: un literal congela un momento, y las claves de milisegundos de origen contra el tiempo de línea de tiempotcrean una rampa (un par plano congela, un par descendente invierte). Establece"frame_blend": "mix"en un clip en cámara lenta (speed< 1.0) o con rampa de velocidad (source_time) para fundir fotogramas de origen consecutivos en lugar de saltar entre los fotogramas más cercanos ("none"). Para un aspecto de tiempo posterizado (stop-motion) en la grabación, usa fotogramas clave desource_timeescalonados que mantengan cada marca de tiempo de origen de destino durante múltiples fotogramas de la línea de tiempo. Un clip consource_timetiene volumen0, así que pon su sonido en su propio elemento deaudio. - El sonido propio de la toma: la voz se mantiene a
volume1.0. Todo lo demás se mezcla por debajo. - Verificación:
frameal inicio, al medio y al último fotograma dibujado, y comprueba que los ojos estén en la banda y que nada importante esté cortado en los lados del marco.
Clave de croma
chroma en el elemento de la grabación elimina la pantalla. Empieza aquí:
color: el color puro de la pantalla,#00FF00para una pantalla verde. Una pantalla iluminada que se haya desviado ligeramente hacia el azul o el amarillo se trata igual con estas tolerancias, por lo que no necesitas muestrearla.tolerance: 0.2 (rango 0.18-0.25). Por encima de aproximadamente 0.3, la clave se come el cabello negro, los cuellos blancos y la ropa oscura.softness: 0.08 (rango 0.05-0.1).spill: 0.9 (rango 0.9-1.0).
Verifícalo antes de poner cualquier cosa encima:
- Tres recortes sin pérdida.
frame --crop <x,y,w,h> --pngen el cabello, en el borde de un hombro o manga, y en las manos, sobre el fondo en el que vas a entregar. Un recorte vuelve a escala real, así que una caja de 200-400 px es suficiente. - ¿Ya está listo? Cabello, cuello y manos sólidos, con como máximo una línea de 1-2 px oscura, oliva o tostada a lo largo de los bordes: la clave está lista, así que continúa. Esa línea es el suelo de borde: cada ajuste de 0.12 a 0.3 lo deja, y
spillya lo ha cambiado de verde a tostado, por lo que un recuento de píxeles verdes lee cero en ella. - De lo contrario, una corrección por defecto. El fondo que se ve a través del cabello, un cuello o ropa oscura: baja
toleranceen 0.05. Un halo pálido o verde más ancho que el suelo de borde: subetoleranceen 0.03, osoftnessen 0.03. Recorta de nuevo y vuelve al paso 2. Como máximo tres ajustes, todos en el mismo elemento con clave: las copias con clave divididas por región multiplican el tiempo de renderizado y aún dejan una costura. - Deriva.
measureel elemento con clave. Su proporción opaca debe mantenerse dentro de uno o dos puntos a lo largo de la toma. Un escalón significa que la iluminación cambió allí: clavetolerancecon un fotograma clave a cada lado del escalón, o corta el elemento en ese fotograma y aplica clave a cada parte por separado.
- Verificación:
framela imagen completa en dos momentos donde el orador se mueva más, y comprueba que el contorno se mantiene.
Subtítulos con la palabra hablada resaltada
Los subtítulos provienen de las marcas de tiempo de palabras suministradas, a través del script incluido, no a mano. python3 scripts/captions.py <proyecto> <palabras> <especificación> (ejecútalo con --help para la especificación) verifica las marcas de tiempo, divide las palabras en páginas de una o dos líneas con measure, da a cada palabra una ventana de highlight mientras se habla, e imprime el proyecto con los subtítulos añadidos. Informa cada reparación en stderr. Lee ese informe: es la verificación de marcas de tiempo.
- Qué comprueba: una palabra que comienza una frase después de que el habla ya se haya reanudado (un "Ahora" suministrado 110 ms tarde y 20 ms largo es el caso clásico), una palabra que se encuentra dentro de un silencio, palabras superpuestas y palabras demasiado cortas para verse. Las palabras cortas se alargan a
min_word(150 ms): hacia la pausa posterior, luego desde la palabra siguiente. Una palabra reportada dentro de un silencio significa que el archivo está desalineado allí: corrige el archivo, luego ejecútalo de nuevo. - Tamaño: 56-72 px en un marco de 1080 de ancho, negrita, un color claro para la línea y el acento de la marca para la palabra hablada.
- Líneas: como máximo dos,
widthaproximadamente el 80 % del ancho del marco. Una página se rompe al final de una oración o en una pausa de 400 ms o más. - Fondo: un
pilldel color de marca más oscuro con un 80-85 % de alfa (CC-D9) se lee sobre cualquier grabación.pad28-36 px a lo ancho y 14-20 px hacia abajo,radius20-28. - Colocación: debajo de la barbilla y fuera del 15-20 % inferior de un marco alto, donde los reproductores dibujan sus controles. En 1080×1920, eso es un centro aproximadamente en
y1350-1450. En un marco ancho, centra un 10-14 % hacia arriba desde la parte inferior. - Las páginas permanecen hasta que comience la página siguiente, o 1 s después de su última palabra cuando le sigue una pausa más larga.
Escribe subtítulos reales, así que actúa sobre los hallazgos de subtítulos que validate plantee sobre ellos.
- Verificación:
frame --from --tosobre una página: cada palabra iluminada es su propia baldosa. Comprueba que cada baldosa ilumina exactamente una palabra, en orden de habla, y que la caja se mantiene alejada de la cara. Luegoframe --atel primer fotograma después de la pausa más larga, y comprueba que la nueva página está activa y que nada está iluminado antes de tiempo.
Barra de nombre sobre grabación
Un tercio inferior se desvanece al entrar y salir. La grabación no es un color plano, por lo que la transición de oclusor de montagent-motion no puede revelar la barra en sí. En su lugar, la barra crece desde su borde, y su texto se revela mediante un oclusor en el mismo color de la barra, que es plano.
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 7000, "output": "out/namebar.mp4",
"fonts": {"bold": [{"file": "fonts/Inter-Bold.ttf"}]},
"fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
"tracks": [
{"name": "bar", "layer": 20, "elements": [
{"id": "bar", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 760, "height": 160, "fill": "#101418", "radius": 8, "scale": [{"t": 1000, "v": [0.0, 1.0]}, {"t": 1300, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}, {"t": 6266, "v": [1.0, 1.0], "ease": "linear"}, {"t": 6533, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
]},
{"name": "bar-edge", "layer": 21, "elements": [
{"id": "bar-edge", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 12, "height": 160, "fill": "#FF5A36"}
]},
{"name": "bar-name", "layer": 22, "elements": [
{"id": "bar-name", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1128, "origin": "center-left", "width": 400, "height": 70, "font": "bold", "size": 58, "color": "#F5F0E6", "runs": [{"text": "Montagent"}], "caption": false}
]},
{"name": "bar-line", "layer": 22, "elements": [
{"id": "bar-line", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1196, "origin": "center-left", "width": 560, "height": 44, "font": "bold", "size": 34, "color": "#F5F0E6", "runs": [{"text": "Video que tu agente puede leer"}], "caption": false}
]},
{"name": "bar-cover", "layer": 23, "elements": [
{"id": "bar-cover-on", "type": "rect", "start": 1300, "end": 1700, "x": 800, "y": 1160, "origin": "center-right", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 1300, "v": [1.0, 1.0]}, {"t": 1666, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]},
{"id": "bar-cover-off", "type": "rect", "start": 6000, "end": 6266, "x": 84, "y": 1160, "origin": "center-left", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 6000, "v": [0.0, 1.0]}, {"t": 6233, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
]}
]
}
- Entrada: la barra crece desde su borde izquierdo durante 250-350 ms,
[0.65, 0, 0.35, 1]. El texto y su cubierta comienzan el fotograma en que la barra está completamente crecida (nunca antes, o la cubierta se muestra sobre la grabación). La cubierta se encoge alrededor de su borde lejano durante 300-400 ms, descubriendo el texto en orden de lectura. - Salida, comenzando en su señal: la cubierta vuelve a crecer sobre el texto en 200-300 ms, luego la barra se encoge de nuevo a su borde durante 250-300 ms. Toda la barra desaparece 450-600 ms después de la señal.
- Tamaño: barra de 130-180 px de alto en un marco de 1080 de ancho, nombre de 52-64 px, segunda línea de 30-38 px. Una tira de acento de 8-16 px de ancho en el borde delantero.
- Cubierta: exactamente el
fillde la barra, 20 px dentro de los extremos de la barra y 10 px dentro de su parte superior e inferior, sobre el texto. - Colocación: 48-80 px hacia adentro desde el lado del marco, fuera de la caja de subtítulos y de la cara del orador, generalmente al 55-65 % de la altura de un marco alto.
- Verificación:
frame --from --to --keyframesdurante 1 s desde cada señal, y comprueba que ninguna cubierta se muestre más allá de la barra en ninguna baldosa.frame --atla barra en reposo, y comprueba que su borde izquierdo esté alineado con el margen de la caja de subtítulos.
Imagen en imagen circular
Muestra un segundo clip en un círculo: un elemento de vídeo con un mask de círculo, un anillo detrás y un pop en la curva bezier de sobreimpulso.
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 6000, "output": "out/pip.mp4",
"tracks": [
{"name": "pip-ring", "layer": 30, "elements": [
{"id": "pip-ring", "type": "ellipse", "start": 1000, "end": 5500, "x": 800, "y": 900, "origin": "center", "width": 384, "height": 384, "fill": "#F5F0E6", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "shadow", "dx": 0, "dy": 16, "radius": 40, "color": "#101418", "opacity": 0.35}]}
]},
{"name": "pip", "layer": 31, "elements": [
{"id": "pip", "type": "video", "start": 1000, "end": 5500, "source": "media/clip.mp4", "source_start": 10000, "source_end": 14500, "volume": 0, "x": 800, "y": 900, "origin": "center", "width": 640, "height": 360, "fit": "contain", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "mask", "shape": "circle", "x": 140, "y": 0, "width": 360, "height": 360}]}
]}
]
}
- El rectángulo del círculo: un cuadrado tan alto como el elemento. Su
xelige qué parte de la imagen se muestra. El centro es(width - height) / 2, y ese es el que se debe usar: el pop escala alrededor delorigindel elemento, por lo que un círculo movido del centro se desplaza lateralmente mientras crece. Para mostrar otra parte de la imagen, elige unsource_startdonde esa parte se sitúe en el medio, o haz el elemento más grande y establece suxpara que la parte caiga en el círculo, luego clavexen la curva del pop para que el centro del círculo se mantenga fijo. - Tamaño: 30-40 % del ancho del marco de ancho. El anillo es de 12-24 px más ancho que el círculo, en el color más claro del fondo, con una
shadowsuave. - Pop: 350-450 ms en
[0.34, 1.56, 0.64, 1]para ambos, desde escala 0, en las mismas claves. Salida en 200-300 ms,ease-in, de vuelta a 0. - Sincronización: entra cuando el orador nombra por primera vez la cosa que muestra, sale un tiempo antes del final para que el cierre sea limpio.
- Colocación: al lado del orador a la altura del pecho, fuera de la cara y la caja de subtítulos, y a 40 px o más del borde del marco.
- Sonido:
volume0 a menos que el sonido propio del clip sea el punto. - Verificación:
frameen el pico del pop (inicio más el 40 % de su duración) y comprueba que el círculo no toque la cara ni el borde del marco.frameen reposo y comprueba que la parte que importa esté dentro del círculo.
Música bajo una voz
La música se reduce mientras la voz habla y vuelve a subir en las pausas. scripts/duck.py lo escribe como fotogramas clave de volume ordinarios en el elemento de música, a partir de las marcas de tiempo de palabras de la voz (--words, una ...)`
[truncada para traducción]