Editando vídeo gravado
Receitas para peças construídas sobre gravações. Elas se encaixam no loop do montagent na etapa de construção; carregue montagent primeiro se ainda não o fez. Para uma cabeça falante, um clipe de apresentador ou um corte de entrevista, abra a estrutura de cabeça falante antes de planejar.
Comece pela gravação
Antes de escrever um elemento, probe cada clipe: seu tamanho, taxa de quadros, duração e se possui som. Em seguida, planeje a peça sobre a voz. Os timings das palavras são o relógio do qual cada legenda, sinal e redução de volume depende, portanto, os timings são verificados primeiro (veja Legendas).
Para escolher um momento de um clipe longo (por exemplo, o trecho de uma gravação de tela a ser mostrado em um insert), coloque o clipe sozinho em um projeto de rascunho e chame frame --from 0 --to <sua duração> --infill-ceiling <ms>, com o teto em um vigésimo da duração. Uma chamada dá um quadro nomeado a cada poucos segundos; frame --at em qualquer quadro que você queira ver mais de perto.
Receitas
Cada receita fornece intervalos iniciais, não respostas. Cada uma termina em uma etapa de olhar: carregue montagent-craft, depois olhe onde a etapa diz antes de prosseguir.
Posicione a gravação
{
"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}]}
]}
]
}
- Gravação larga em um quadro alto: faça o elemento tão alto quanto o quadro e tão largo quanto a proporção da fonte permite (1920 de altura é 3413 de largura para 16:9), depois deslize-o lateralmente para manter o orador centralizado.
- Olhos: 25–35 % descendo no quadro. Abaixe o
bottom-centerdo elemento além da borda inferior do quadro para chegar lá; cortar as pernas é normal. - Espaço para a cabeça: 4–8 % da altura do quadro acima do cabelo.
- Um take mais curto que a peça:
"overrun": "hold"congela seu último quadro. Mantenha o congelamento abaixo de meio segundo, ou termine a peça mais cedo. - Um quadro congelado dentro de um clipe, uma rampa de velocidade ou um reverso: escreva
source_timeno lugar desource_startesource_end: um literal congela um momento, e chaves de milissegundos da fonte contratda linha do tempo fazem a rampa (um par plano congela, um par decrescente inverte). Defina"frame_blend": "mix"em um clipe em câmera lenta (speed< 1.0) ou com rampa de velocidade (source_time) para fazer cross-dissolve entre quadros consecutivos da fonte em vez de pular entre os quadros mais próximos ("none"). Para um visual de tempo posterizado (stop-motion) na gravação, usesource_timecom keyframes escalonados segurando cada timestamp alvo da fonte em vários quadros da linha do tempo. Um clipe comsource_timefica silencioso novolume0, então coloque seu som em seu próprio elementoaudio. - O som próprio do take: a voz permanece no
volume1.0. Todo o resto é mixado abaixo dela. - Olhe:
frameno início, no meio e no último quadro desenhado, e verifique se os olhos estão na faixa e nada importante é cortado nas laterais do quadro.
Chroma key
chroma no elemento de gravação faz a chave da tela. Comece aqui:
color: a cor pura da tela,#00FF00para uma tela verde. Uma tela iluminada que se desviou um pouco para o azul ou amarelo faz a chave da mesma forma com essas tolerâncias, então você não precisa amostrá-la.tolerance: 0.2 (faixa 0.18–0.25). Acima de cerca de 0.3 a chave começa a comer cabelo preto, colarinho branco e roupas escuras.softness: 0.08 (faixa 0.05–0.1).spill: 0.9 (faixa 0.9–1.0).
Verifique antes de qualquer outra coisa ser colocada por cima:
- Três crops sem perda.
frame --crop <x,y,w,h> --pngno cabelo, na borda de um ombro ou manga, e nas mãos, sobre o fundo em que você finalizará. Um crop volta em escala real, então uma caixa de 200–400 px é suficiente. - Já está bom? Cabelo, colarinho e mãos sólidos, com no máximo uma linha de 1–2 px escura, verde-oliva ou bronzeada ao longo das bordas: a chave está pronta, então siga em frente. Essa linha é o piso de borda: toda configuração de 0.12 a 0.3 a deixa, e
spilljá a transformou de verde para bronzeado, então uma contagem de pixels verdes lê zero nela. - Caso contrário, uma correção por defeito. O fundo aparecendo através do cabelo, colarinho ou roupas escuras: diminua
toleranceem 0.05. Um halo pálido ou verde mais largo que o piso de borda: aumentetoleranceem 0.03, ousoftnessem 0.03. Corte novamente e volte para 2. No máximo três configurações, todas no mesmo elemento com chave: cópias com chave divididas por região multiplicam o tempo de renderização e ainda deixam uma costura. - Deriva.
measureo elemento com chave. Sua parcela opaca deve permanecer dentro de um ou dois pontos ao longo do take. Um degrau significa que a iluminação mudou ali: faça a chave detolerancecom um keyframe de cada lado do degrau, ou corte o elemento nesse quadro e faça a chave de cada parte separadamente.
- Olhe:
framea imagem inteira em dois momentos onde o orador se move mais, e verifique se o contorno se mantém.
Legendas com a palavra falada destacada
As legendas vêm dos timings de palavras fornecidos, através do script incluído, não manualmente. python3 scripts/captions.py <projeto> <palavras> <especificação> (execute com --help para a especificação) verifica os timings, divide as palavras em páginas de uma ou duas linhas com measure, dá a cada palavra uma janela de highlight enquanto é falada, e imprime o projeto com as legendas adicionadas. Ele relata cada reparo no stderr. Leia esse relatório: é a verificação de timing.
- O que verifica: uma palavra que começa uma frase depois que a fala já foi retomada (um "Now" fornecido 110 ms atrasado e 20 ms longo é o caso clássico), uma palavra que está dentro de um silêncio, palavras sobrepostas e palavras muito curtas para serem vistas. Palavras curtas são alongadas para
min_word(150 ms): para dentro da pausa depois e, em seguida, da próxima palavra. Uma palavra relatada dentro de um silêncio significa que o arquivo está desalinhado ali: corrija o arquivo e execute novamente. - Tamanho: 56–72 px em um quadro de 1080 de largura, negrito, uma cor clara para a linha e o acento da marca para a palavra falada.
- Linhas: no máximo duas,
widthcerca de 80 % da largura do quadro. Uma página quebra no final de uma frase ou em uma pausa de 400 ms ou mais. - Fundo: um
pillda cor mais escura da marca com 80–85 % de alfa (CC–D9) se lê sobre qualquer gravação.padde 28–36 px transversalmente e 14–20 px para baixo,radius20–28. - Posicionamento: abaixo do queixo e longe dos 15–20 % inferiores de um quadro alto, onde os players desenham seus controles. Em 1080×1920, isso é um centro em cerca de
y1350–1450. Em um quadro largo, centralize 10–14 % acima da parte inferior. - Páginas permanecem até a próxima página começar, ou 1 s após sua última palavra quando uma pausa mais longa se segue.
Ele escreve legendas reais, então aja sobre as descobertas de legendas que validate levanta sobre elas.
- Olhe:
frame --from --tosobre uma página: cada palavra acesa é seu próprio quadro. Verifique se cada quadro acende exatamente uma palavra, em ordem de fala, e se a caixa fica longe do rosto. Em seguida,frame --ato primeiro quadro após a pausa mais longa, e verifique se a nova página está visível e nada está aceso prematuramente.
Barra de nome sobre a gravação
Um terço inferior aparece e desaparece. A gravação não é uma cor sólida, então a animação de oclusão do montagent-motion não pode revelar a barra em si. Em vez disso, a barra cresce a partir de sua borda, e seu texto é revelado por um oclusor na própria cor da barra, que é sólida.
{
"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 your agent can read"}], "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: a barra cresce a partir de sua borda esquerda durante 250–350 ms,
[0.65, 0, 0.35, 1]. O texto e sua capa começam no quadro em que a barra está totalmente crescida (nunca antes, ou a capa aparece sobre a gravação). A capa encolhe em torno de sua borda distante durante 300–400 ms, revelando o texto na ordem de leitura. - Saída, começando em seu sinal: a capa cresce de volta sobre o texto em 200–300 ms, então a barra encolhe de volta para sua borda durante 250–300 ms. Toda a barra desaparece 450–600 ms após o sinal.
- Tamanho: barra com 130–180 px de altura em um quadro de 1080 de largura, nome 52–64 px, segunda linha 30–38 px. Uma faixa de destaque com 8–16 px de largura na borda inicial.
- Capa: exatamente o
fillda barra, 20 px dentro das extremidades da barra e 10 px dentro de seu topo e base, acima do texto. - Posicione: 48–80 px para dentro da lateral do quadro, longe da caixa de legenda e do rosto do orador, geralmente a 55–65 % da altura de um quadro alto.
- Olhe:
frame --from --to --keyframesao longo de 1 s a partir de cada sinal, e verifique se nenhuma capa aparece além da barra em nenhum quadro.frame --ata barra em repouso, e verifique se sua borda esquerda se alinha com a margem da caixa de legenda.
Picture-in-picture circular
Mostre um segundo clipe em um círculo: um elemento de vídeo com um mask de círculo, um anel atrás dele e um efeito de "pop" na curva bezier de overshoot.
{
"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}]}
]}
]
}
- O retângulo do círculo: um quadrado tão alto quanto o elemento. Seu
xescolhe qual parte da imagem aparece. O centro é(width - height) / 2, e esse é o único a usar: o "pop" escala em torno daorigindo elemento, então um círculo deslocado do centro deriva lateralmente enquanto cresce. Para mostrar outra parte da imagem, escolha umsource_startonde essa parte está no meio, ou torne o elemento maior e defina seuxpara que a parte caia no círculo, então keyframexna curva do "pop" para que o centro do círculo permaneça parado. - Tamanho: 30–40 % da largura do quadro. O anel é 12–24 px mais largo que o círculo, na cor mais clara do fundo, com um
shadowsuave. - Pop: 350–450 ms em
[0.34, 1.56, 0.64, 1]para ambos, a partir da escala 0, nas mesmas chaves. Saída em 200–300 ms,ease-in, de volta a 0. - Timing: entra quando o orador nomeia pela primeira vez a coisa que mostra, sai um pouco antes do final para que o fechamento seja limpo.
- Posicione: ao lado do orador na altura do peito, longe do rosto e da caixa de legenda, e a 40 px ou mais da borda do quadro.
- Som:
volume0 a menos que o som do próprio clipe seja o objetivo. - Olhe:
frameno pico do "pop" (início mais 40 % de sua duração) e verifique se o círculo não toca no rosto nem na borda do quadro.frameem repouso e verifique se a parte importante está dentro do círculo.
Música sob uma voz
A música tem seu volume reduzido enquanto a voz fala e volta nos intervalos. scripts/duck.py escreve isso como keyframes comuns de volume no elemento de música, a partir dos timings das palavras da voz (--words, um arquivo de timings de palavras), e toma o caminho do elemento de música e a duração total do projeto. Leva 20–30 ms para ser executado; execute-o e leia o relatório.
-
Duck: silêncio da música em
volume0.1–0.15, volume total da voz emvolume1.0. -
Ataque: 60–100 ms para reduzir da música cheia para o volume reduzido, e 200–400 ms para retornar ao volume cheio.
-
Espere pelo final: o duck da última palavra mantém a música reduzida por 400–600 ms.
-
A voz em si:
volume1.0,duck0. O duck da música não afeta nada mais, e o elemento de voz não precisa de keyframes de volume. -
Olhe:
frame --from --to --keyframessobre uma palavra curta, e verifique se o volume da música cai antes de a palavra começar.framesobre o intervalo após a última palavra pausada, e verifique se o volume da música sobe uma vez, aproximadamente 400–600 ms após o pico da última palavra.
E depois?
O projeto pode ser renderizado com render. O skill montagent-craft ainda pode inspecionar o projeto e validate pode verificá-lo uma vez.