Communitygithub.com

Montagent – Edição de Vídeo Gravado

Edite vídeos reais no Montagent: cabeças falantes e entrevistas, chroma key, legendas e legendas palavra por palavra, barras de nome, picture-in-picture e música com volume reduzido sob a voz. Use quando um vídeo do Montagent começar a partir de gravações.

O que é Montagent – Edição de Vídeo Gravado?

Esta skill do Montagent fornece receitas e orientações detalhadas para editar peças de vídeo construídas a partir de gravações de arquivo. Ela é projetada para ser usada na etapa de construção do loop do Montagent, com instruções para carregar o skill `montagent-craft` para inspeção visual. A skill abrange o posicionamento do vídeo (incluindo como lidar com olhos, espaço para a cabeça e takes mais curtos), aplicação de chroma key (com parâmetros iniciais e um processo de ajuste fino de três passos), geração automática de legendas com destaque da palavra falada (através de um script Python que verifica o timing, quebra o texto em páginas e cria janelas de destaque), criação de barras de nome com animações de revelação sobrepostas ao vídeo, inserção de picture-in-picture circular com animação de escala e mixagem de áudio para reduzir o volume da música durante a fala. O fluxo de trabalho enfatiza a verificação visual em cada etapa com o comando `frame` e a validação dos resultados. Compatível com a plataforma Montagent.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MBehtemam/montagent-skills/tree/HEAD/skills/montagent-footage

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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-center do 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_time no lugar de source_start e source_end: um literal congela um momento, e chaves de milissegundos da fonte contra t da 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, use source_time com keyframes escalonados segurando cada timestamp alvo da fonte em vários quadros da linha do tempo. Um clipe com source_time fica silencioso no volume 0, então coloque seu som em seu próprio elemento audio.
  • O som próprio do take: a voz permanece no volume 1.0. Todo o resto é mixado abaixo dela.
  • Olhe: frame no 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, #00FF00 para 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:

  1. Três crops sem perda. frame --crop <x,y,w,h> --png no 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.
  2. 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 spill já a transformou de verde para bronzeado, então uma contagem de pixels verdes lê zero nela.
  3. Caso contrário, uma correção por defeito. O fundo aparecendo através do cabelo, colarinho ou roupas escuras: diminua tolerance em 0.05. Um halo pálido ou verde mais largo que o piso de borda: aumente tolerance em 0.03, ou softness em 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.
  4. Deriva. measure o 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 de tolerance com um keyframe de cada lado do degrau, ou corte o elemento nesse quadro e faça a chave de cada parte separadamente.
  • Olhe: frame a 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, width cerca 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 pill da cor mais escura da marca com 80–85 % de alfa (CC–D9) se lê sobre qualquer gravação. pad de 28–36 px transversalmente e 14–20 px para baixo, radius 20–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 y 1350–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 --to sobre 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 --at o 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 fill da 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 --keyframes ao longo de 1 s a partir de cada sinal, e verifique se nenhuma capa aparece além da barra em nenhum quadro. frame --at a 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 x escolhe qual parte da imagem aparece. O centro é (width - height) / 2, e esse é o único a usar: o "pop" escala em torno da origin do elemento, então um círculo deslocado do centro deriva lateralmente enquanto cresce. Para mostrar outra parte da imagem, escolha um source_start onde essa parte está no meio, ou torne o elemento maior e defina seu x para que a parte caia no círculo, então keyframe x na 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 shadow suave.
  • 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: volume 0 a menos que o som do próprio clipe seja o objetivo.
  • Olhe: frame no 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. frame em 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 volume 0.1–0.15, volume total da voz em volume 1.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: volume 1.0, duck 0. 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 --keyframes sobre uma palavra curta, e verifique se o volume da música cai antes de a palavra começar. frame sobre 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.

Referências

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Habilidades Relacionadas