videos/bonecos_presidentes/é o segundo motor de vídeo da casa — Python + ffmpeg, sem navegador. Ele produziu as duas peças GOV TOYS, 9:16, 1080×1920, 30fps:gov_toys_1_presidentes.mp4(34,22s) egov_toys_2_governadores.mp4(45,27s). O outro motor é o laboratório de vídeo, em stack web. Os dois continuam vivos e não são concorrentes — escolher entre eles é a primeira decisão de qualquer peça nova, e é o que a seção abaixo resolve.
Qual dos dois motores usar
_Lab_Video/web/ | videos/bonecos_presidentes/ | |
|---|---|---|
| Como desenha | HTML/CSS animado, capturado no Chromium | ffmpeg operando direto sobre PNG e MP4 |
| De onde vem a imagem | recorte, foto, texto — você desenha a cena | imagem gerada por IA — você monta a cena pronta |
| Movimento | window.render(t), gesto a gesto (as 16 entradas de efeitos.js) | zoompan (Ken Burns) e corte de clipe de IA |
| Legenda | é elemento da própria peça, dentro do HTML | arquivo .ass queimado no fim |
| Quando se vê o resultado | no navegador, antes de renderizar | só depois do render |
| Custo de IA | quase zero na imagem (a arte é recorte) | é o item caro — ver a tabela mais abaixo |
A regra prática: se a peça é colagem/scrapbook — recorte de jornal, foto real, carimbo, fita crepe, texto que entra dançando — é a stack web, e você ganha a prévia no navegador. Se a peça é cena fotorrealista que não existe (bonecos numa prateleira, o cenário de uma loja), a arte tem que nascer em IA e o trabalho vira montagem: aí é este motor.
A consequência que interessa ao orçamento: no motor web, mudar o timing é reescrever JSON e rodar de novo, de graça. Aqui, mudar um plano pode custar 450 créditos, porque o plano é um clipe gerado. Por isso este motor foi escrito para tirar movimento de imagem parada sempre que dá — dos 25 segmentos das duas peças, 22 são Ken Burns sobre PNG e só 3 são recortes de clipe de IA.
O pipeline, pasta a pasta
| Pasta | O que mora ali | Como se produz |
|---|---|---|
00_refs/ | referência visual (o boneco, a caixa, o estilo) | coletado à mão, antes de gerar qualquer coisa |
01_roteiro/ | ROTEIRO_v1.md, cena a cena | escrito — é o que vira /roteiros |
02_audio/ | narração, sfx/, trim/ e trilha.mp3 | TTS + música + efeitos (Magnific) |
03_frames/ | full/ e crops/ — os PNG 9:16 | imagens de IA (Nano Banana / Magnific) |
04_clipes/ | os clipes de vídeo de IA | Kling 3.0, só onde a imagem parada não resolve |
05_saida/ | os MP4, os .ass e as pastas de revisão | python montar2.py [v1 / v2 / ambos] |
⚠️
05_saida/e03_frames/são saída regenerável, e05_saida/carregatmp_*,_rev*,_i2..4,_inspe_v3dentro. O corte que importa são quatro arquivos:gov_toys_1_presidentes.mp4egov_toys_2_governadores.mp4, mais os dois_leve.mp4(2,1 e 2,8 MB), que existem para quando o upload estoura por timeout. Os arquivos da pasta estão catalogados em /midia; o roteiro, em /roteiros/bonecos-presidentes.
O que o montar2.py faz, na ordem
Um script, duas peças. V1_SEG e V2_SEG são listas de segmentos; cada linha é
(nome, tipo, arquivo, duração, parâmetro) e a duração está digitada ali. É a
diferença mais importante em relação ao outro motor: lá a narração manda no tempo e
ninguém cronometra; aqui o tempo é digitado no script e a narração é encaixada nele.
Mexer numa duração desloca a legenda e o SFX daquele ponto para a frente — os três estão
escritos lado a lado, no mesmo bloco, exatamente por isso.
- Segmento a segmento (
build_segment), em três modos:kbz— Ken Burns:zoompancom zoom dez0az1e centro verticalcy, sobre um PNG parado. É o modo de 22 dos 25 segmentos.clip— recorta um trecho de clipe de IA (-ss), reescala e corta para 1080×1920.clipz— o mesmo, com um zoom fixo por cima (aproximar sem gerar de novo).
- Cartão final (
card_final), 2,00s: fundo verde#0B4D2Ce seisdrawtextcom fade escalonado — "GOV TOYS", a assinatura da peça,@beneverso, as hashtags e o disclaimer ("Bonecos vendidos separadamente." / "Não acompanha democracia."). É texto queimado no ffmpeg, não gerado por IA — ver a lição 4. - Concat mudo —
ffmpeg -f concat -c copy, sem reencodar. - Voz — concatena os
.wavjá aparados de02_audio/trim/. A voz da criança não é um TTS infantil: é a mesma locução puxada em pitch (asetrate=48000*1.28,aresample,atempo=0.781). - Mixagem — a trilha entra a 0.42 e passa por
sidechaincompressabaixada pela própria voz (threshold 0.03, ratio 9, attack 8, release 320): a música cede sozinha quando o locutor fala e volta quando ele cala. Os SFX entram poradelayno milissegundo marcado. Fecha emalimitera 0.95. - Loudness —
loudnormem dois passos (ver lição 5). - Legenda —
gerar_ass()escreve o.asse o filtrosubtitlesqueima no vídeo. - Mux final —
-c:v copy+ AAC 192k. O vídeo não é reencodado uma segunda vez.
A marcação de legenda
O formato de escrita é minúsculo e vale copiar: cada bloco é (início, fim, [linhas]),
| é quebra de linha e @texto@ fica amarelo (#FFD84D) no meio do branco. O
tempo de cada linha dentro do bloco é dividido por peso de caractere — ninguém marca
legenda linha a linha, só o começo e o fim do bloco. Estilo: Arial Black 74, contorno
preto 7, MarginV: 360 — a margem alta é para a legenda não cair atrás da interface do
Instagram.
As fontes:
card_final()usa Impact e Arial Bold; o.assusa Arial Black. Isso é escolha de gênero (paródia de comercial de varejo dos anos 90), não o design system de imagens da casa (Anton/Bungee/Archivo). Quem reusar este motor numa peça que não é paródia de comercial troca a fonte em dois lugares — a listaLINdocard_finale oStyle:doASS_HEADER— e nos dois o caminho é absoluto de Windows.
O custo real, medido
Esta é a única produção do projeto com gasto de IA contado crédito a crédito. Até alguém medir outra, a tabela abaixo é a régua de orçamento da casa.
Gasto total: 6.645 créditos, de um teto de 20.000 (saldo 40.393 → 33.748). Sobraram 13.355.
⚠️ O modo ilimitado da conta NÃO estava ativo nesta sessão. Tudo debitou crédito de verdade. É a confirmação de campo da regra que o laboratório de vídeo já enuncia ("gerações gastam crédito — simulo o custo antes de rodar"): não confie no plano. Rode
account_balanceno começo e olheunlimitedAppliesHere— se vierfalse, cada lote é dinheiro.
Preço unitário medido (20-21/08/2026)
| Recurso | Créditos |
|---|---|
| Nano Banana Pro / NB2 — 2k 9:16 | 75 |
| GPT-2 — 2k 9:16 | 260 |
| Kling 3.0 — 1080p | 90 por segundo (5s = 450 · 10s = 900) |
| Kling 3.0 Turbo — 5s 1080p | 1.300 — evitar (quase 3× o normal) |
| TTS, bloco curto | 20–52 |
| Música, 60s | 1.200 |
| SFX | 10–15 |
O preço do Kling é linear no segundo — multishot não economiza nada. Um clipe de 10s custa exatamente o mesmo que dois de 5s.
Onde o dinheiro foi
| Item | Créditos | Fatia |
|---|---|---|
| Kling (5 clipes = 2.070 · combo do tetra refeito = 450 · clipe da menina refeito = 450) | 2.970 | 45% |
| Trilha (um jingle instrumental de 60s) | 1.200 | 18% |
| Todo o resto (as imagens, a locução — 8 blocos de locutor mais o diálogo criança/mãe —, 4 SFX) | 2.475 | 37% |
| Total | 6.645 |
Vídeo e música são 4.170 dos 6.645 — 63% do gasto em 8 itens (5 clipes Kling, o combo do tetra refeito, o clipe da menina refeito e a trilha). As imagens, que são a peça inteira na tela, custaram menos que a trilha sozinha. Duas consequências na hora de orçar a próxima:
- Corte segundo de Kling antes de cortar imagem. Cada segundo de clipe a menos vale 1,2 imagem 2k a mais.
- Uma trilha de 60s custa o mesmo que 16 imagens. Se a peça aceita SFX + silêncio, ou se existe trilha reaproveitável de outra produção, é o corte de maior retorno da lista.
As cinco lições técnicas
Transcritas do CUSTOS.md. As duas primeiras são as que mais se pagam.
1. O Kling destrói texto sob movimento forte, e piora quanto mais a câmera se aproxima.
"COLEÇÃO EX-GOVERNADORES DO RIO" saiu "COLEÇÃO CICEFRAEUNTEE SUS O O RIO" num
travelling que terminava em close. Regra: Kling só para movimento amplo e suave;
close de detalhe é Ken Burns no ffmpeg — sai de graça, fica mais nítido e o texto não
troca de letra. É exatamente o que o modo kbz do montar2.py faz, e é a razão de ele
existir. E se o plano depende de texto legível em português (um scroll de nomes, uma
placa, um rodapé), ele não pode ser gerado por IA: é grafismo em drawtext ou .ass
sobre fundo.
2. Prompt de vídeo precisa de trava explícita. "A câmera fica parada", "os textos permanecem congelados e legíveis", "as caixas não saem do quadro", "sem entortar, sem derreter". Sem a trava escrita, o modelo inventa movimento — e movimento é o que quebra o texto (lição 1).
3. O filtro NSFW barra uniforme de presidiário quando o prompt descreve a roupa. Descrever só os textos da embalagem passa. Custou duas falhas pagas nesta produção (uma na correção das caixas de presidentes, outra nas cenas). Vale para qualquer peça que precise de figurino carcerário: descreva o rótulo, não a veste.
4. Letreiro promocional não se gera por IA. O cenário original voltou com
"BRASILEIROS! BRASILEIROS!", "MICHEL TEME" e um DDD que não existe. Solução: peça o
cenário sem texto nenhum e queime o letreiro no ffmpeg. É o que o card_final() faz.
5. loudnorm de passo único não crava o alvo. Para bater -14 LUFS (o padrão de
rede social) são dois passos: medir com print_format=json, ler input_i,
input_tp, input_lra, input_thresh e target_offset, e aplicar de novo passando
os valores medidos com linear=true. O montar2.py já faz assim — quem escrever motor
novo copia esse trecho em vez de reinventar.
Original completo
videos/bonecos_presidentes/, na raiz de Documents/Bené/: o CUSTOS.md (a tabela de
crédito e as cinco lições, na íntegra), o montar2.py (o motor), o legendas.py (o
gerador de .ass do corte antigo — ver a ressalva no topo desta página), o
01_roteiro/ROTEIRO_v1.md e o LEGENDA_POST.md (três opções de legenda de post).
O outro motor de vídeo, e quando preferir ele, está em O laboratório de vídeo. As ferramentas de imagem estática são outras: Ferramentas que rodam só na máquina e o design system de imagens. Quem for gerar com IA lê antes o guia de ferramentas de IA.