E1 · Motores
5 minRode "baixar o site-movimento e testar os motores".
Pronto quando: 4/4 motores OK e saída: 0.
Aula 6 · 18 min
Um filme de abertura longo não sai de um clipe só: sai de vários clipes curtos encadeados, cada um começando no último quadro real do anterior. O risco é o gerador cortar escondido no meio de um clipe. A skill site-movimento tem portões que pegam isso. Você roda os portões em clipes de ensaio, um contínuo e um com corte, sem gastar crédito.
Começar a aula
Objetivo: encadear clipes num filme contínuo e provar com os portões do site-movimento que não há corte escondido.
O passo 4 da skill (vídeo). Clique em cada etapa.
Sem motor de vídeo, a skill faz o filme em código (passos 1, 2, 5, 6 e 7 iguais). Números do piloto: 300 créditos de Kling 3.0 em 720p, 285 quadros no filme horizontal e 361 no vertical (README, 18/10/2026).
Com DRY_RUN=1 cada motor só mostra o que faria. O teste confere os quatro.
E=${TMPDIR:-/tmp}/ensaio-sites/a6; rm -rf "$E"; mkdir -p "$E"; cd "$E"
git clone -q https://github.com/inematds/site-movimento && git -C site-movimento checkout -q d9a43a4; echo "clone: $?"
bash site-movimento/skill/site-movimento/tests/motores-contrato.sh; echo "saída: $?"clone: 0 OK kling OK agnes OK kie OK custom 4/4 motores OK saída: 0
Nenhum serviço foi chamado: o DRY_RUN sai antes de ler qualquer chave. Gerar de verdade usa a conta e os créditos do motor que você escolher; o curso não faz isso.
O ensaio imita o encadeamento: o clipe 2 começa no zoom em que o clipe 1 terminou.
K=~/projetos/formacao-cinema-ia-sites-v72/kit
E=${TMPDIR:-/tmp}/ensaio-sites/a6; SM=$E/site-movimento/skill/site-movimento/scripts
# dois clipes encadeados: o 2º começa exatamente onde o 1º terminou (zoom 1,25)
bash "$K/scripts/clipe.sh" "$K/exemplos/lente.jpg" "$E/c1.mp4" 4 1.0 1.25
bash "$K/scripts/clipe.sh" "$K/exemplos/lente.jpg" "$E/c2.mp4" 4 1.25 1.5
python3 "$SM/cortes.py" "$E/c1.mp4" "$E/c2.mp4" | sed "s#$E/##"; echo "cortes: ${PIPESTATUS[0]}"
rm -rf "$E/site"; cp -r "$K/site" "$E/site"
python3 "$SM/montar.py" "$E/site" "$E/c1.mp4:0:-1" "$E/c2.mp4:1:-1" | head -1 | sed "s#$E/##"
python3 "$SM/continuidade.py" "$E/site/frames" | sed "s#$E/##"; echo "saída: ${PIPESTATUS[0]}"c1.mp4: 4,0 s · 24 fps · 1920×1080 c2.mp4: 4,0 s · 24 fps · 1920×1080 c1.mp4 quadros 97, mediana 1.00, piores [(77, 0.99), (90, 0.99)] ok c2.mp4 quadros 97, mediana 1.00, piores [(1, 0.99), (95, 0.99)] ok cortes: 0 site: 191 quadros, 3.4 MB, cor da emenda #050605 continuidade — site/frames: 48 quadros (a cada 4), mediana 0.983 PASSA — um movimento só saída: 0
4 s + 4 s = 191 quadros (o quadro 0 do clipe 2 sai, para não repetir). O montar.py grava em site/frames, a pasta que a página do kit já lê.
Um clipe que pula de cena no meio: a lente no estúdio escuro e, de repente, no fundo claro.
K=~/projetos/formacao-cinema-ia-sites-v72/kit
E=${TMPDIR:-/tmp}/ensaio-sites/a6; SM=$E/site-movimento/skill/site-movimento/scripts
# um clipe com corte escondido no meio: a lente no estúdio escuro e, de repente, no fundo claro
bash "$K/scripts/clipe.sh" "$K/exemplos/lente.jpg" "$E/a.mp4" 2 1.0 1.1
bash "$K/scripts/clipe.sh" "$K/exemplos/lente-clara.jpg" "$E/b.mp4" 2 1.1 1.2
ffmpeg -v error -y -i "$E/a.mp4" -i "$E/b.mp4" -filter_complex "[0:v][1:v]concat=n=2:v=1[v]" -map "[v]" -c:v libx264 -crf 18 "$E/c3.mp4"
python3 "$SM/cortes.py" "$E/c3.mp4" | sed "s#$E/##"; echo "saída: ${PIPESTATUS[0]}"a.mp4: 2,0 s · 24 fps · 1920×1080 b.mp4: 2,0 s · 24 fps · 1920×1080 c3.mp4 quadros 97, mediana 1.00, piores [(48, 0.46), (72, 0.99)] CORTE no(s) quadro(s) [48] saída: 1
O par de quadros 48 cai para 0,46 contra mediana 1,00: corte. Um corte entre dois quadros escuros e parecidos pode passar no cortes.py; por isso a skill também roda o continuidade.py e você olha o filme.
Clipes pagos saem em ordem, um por vez. Rode, interrompa e rode de novo: só o que faltou volta.
Simulação no navegador: nada é gerado. A falha é proposital, para mostrar que só o clipe com corte volta.
Versão do site-movimento do portão da aula 3: lê português, inglês e espanhol.
K=~/projetos/formacao-cinema-ia-sites-v72/kit
P=${TMPDIR:-/tmp}/ensaio-sites/a6/site-movimento/skill/site-movimento/scripts/portao-texto.js
node "$P" "$K/site/index.html"; echo "saída: $?"
node "$P" "$K/exemplos/texto-ruim-pt.html" 2>&1 | head -5; echo "saída: ${PIPESTATUS[0]}"✓ ~/projetos/formacao-cinema-ia-sites-v72/kit/site/index.html — texto limpo
saída: 0
✗ ~/projetos/formacao-cinema-ia-sites-v72/kit/exemplos/texto-ruim-pt.html — 3 defeito(s)
manda a pessoa rolar
…Aurora 35 Role para baixo e veja a lente de perto.…
narra a câmera
…e de perto. Um plano-sequência A câmera avança pelo vidro até o diafragma…
saída: 1O portão também reprova travessão, jargão de IA ("revolucionário"), texto provisório e o quadro do filme repetido como imagem logo abaixo.
Os portões do filme, sem gerar nada.
Rode "baixar o site-movimento e testar os motores".
Pronto quando: 4/4 motores OK e saída: 0.
Rode "encadear, montar e provar a continuidade". Depois sirva a pasta site/ do ensaio e rode o verificar.mjs nela.
Pronto quando: PASSA — um movimento só com saída: 0, e o verificador responde quadros: 191 (frames/) e OK: 3 de 3 posições.
Rode "um clipe com corte". Depois troque lente-clara.jpg por lente2.jpg (outra foto escura) e rode de novo: anote o pior par e diga por que passou.
Pronto quando: Com a lente clara: CORTE no(s) quadro(s) [48] e saída: 1.
Rode o portão de texto na página que você está fazendo.
Pronto quando: texto limpo e saída: 0.
A explicação aparece depois da sua resposta.
Pergunta 1 de 4
De onde o clipe 2 deve começar?
Pergunta 2 de 4
O cortes.py achou um corte no meio do clipe 3. O que a skill manda fazer?
Pergunta 3 de 4
Por que o continuidade.py compara com a mediana local, e não com um limite fixo?
Pergunta 4 de 4
O que o DRY_RUN=1 garante no teste dos motores?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.