Pular para o conteúdo
Beneverso
Equipe

Guia

O segundo motor de vídeo: Python + ffmpeg (GOV TOYS)

O motor que fechou os dois comerciais de bonecos: o pipeline de 00_refs a 05_saida, quando escolher ele em vez da stack web, e o único custo de IA que o projeto tem medido em crédito.

Produção

Original no vault: videos/bonecos_presidentes/CUSTOS.md

Esta página também reúne

  • videos/bonecos_presidentes/montar2.pyo motor atual da montagem; o pipeline desta página foi lido daqui, não de prosa
  • videos/bonecos_presidentes/legendas.pyo gerador de legenda que está SUPERADO e continua na pasta (ver a ressalva desta página)
  • videos/bonecos_presidentes/01_roteiro/ROTEIRO_v1.mdo roteiro da produção, o mesmo que /roteiros/bonecos-presidentes transcreve
Ressalva: ISTO NÃO É A TRANSCRIÇÃO DE UM DOCUMENTO SÓ. A tabela de custos e as cinco lições vêm do `videos/bonecos_presidentes/CUSTOS.md`. O pipeline e a mecânica da montagem foram LIDOS DO CÓDIGO de `montar2.py` e `legendas.py` — não existe prosa no disco descrevendo esse motor, e é por isso que esta página existe. ⚠️ A TABELA DE ORIGEM NÃO FECHA COM ELA MESMA, e o número que vale é o de baixo. As 16 linhas de etapa do `CUSTOS.md` somam 6.795, mas o documento anuncia 6.645 — que é o delta de saldo (40.393 − 33.748) e é o número confiável, porque veio da conta e não da digitação. Sobram 150 créditos que não fecham na origem. Ninguém precisa reabrir isso para orçar: quem orça usa os preços unitários, que foram medidos e conferidos um a um. Está escrito aqui para a próxima pessoa não perder meia hora refazendo a soma achando que descobriu um erro novo. `legendas.py` ESTÁ SUPERADO e continua na pasta. Ele gera um `.ass` único de 58,72s, que é a marcação do corte antigo em bloco só (`05_saida/govtoys_v3.mp4`). O motor atual, `montar2.py`, tem a própria `gerar_ass()` embutida e grava `legendas_gov_toys_1_presidentes.ass` e `legendas_gov_toys_2_governadores.ass`. Quem editar `legendas.py` achando que está mexendo na legenda das peças publicadas não vai mudar nada na tela. `montar.py` e `montar_old.py`, na mesma pasta, são versões anteriores do montador. AS DURAÇÕES DE 27s + 30s (~58s) QUE CIRCULAM SOBRE ESTA PRODUÇÃO SÃO DO CORTE ANTIGO. Os dois MP4 que estão no disco hoje medem 34,22s e 45,27s (ffprobe em 21/08/2026), e as tabelas de segmento do `montar2.py` somam exatamente isso. ESTE MOTOR SÓ RODA NO WINDOWS COMO ESTÁ ESCRITO: `card_final()` chama `C:/Windows/Fonts/impact.ttf` e `arialbd.ttf` por caminho absoluto, e o filtro de legenda passa `fontsdir='C:/Windows/Fonts'`. Não é defeito — é o que precisa mudar antes de rodar em qualquer outra máquina. O CUSTO É DE UMA PRODUÇÃO SÓ, e é a única medição de crédito que o projeto tem. Preço de fornecedor muda; a data (20-21/08/2026) faz parte do dado. Confirme com `simulate_cost` antes de usar a tabela como orçamento.

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) e gov_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 desenhaHTML/CSS animado, capturado no Chromiumffmpeg operando direto sobre PNG e MP4
De onde vem a imagemrecorte, foto, texto — você desenha a cenaimagem gerada por IA — você monta a cena pronta
Movimentowindow.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 HTMLarquivo .ass queimado no fim
Quando se vê o resultadono navegador, antes de renderizarsó depois do render
Custo de IAquase 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

PastaO que mora aliComo 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 cenaescrito — é o que vira /roteiros
02_audio/narração, sfx/, trim/ e trilha.mp3TTS + música + efeitos (Magnific)
03_frames/full/ e crops/ — os PNG 9:16imagens de IA (Nano Banana / Magnific)
04_clipes/os clipes de vídeo de IAKling 3.0, só onde a imagem parada não resolve
05_saida/os MP4, os .ass e as pastas de revisãopython montar2.py [v1 / v2 / ambos]

⚠️ 05_saida/ e 03_frames/ são saída regenerável, e 05_saida/ carrega tmp_*, _rev*, _i2..4, _insp e _v3 dentro. O corte que importa são quatro arquivos: gov_toys_1_presidentes.mp4 e gov_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.

  1. Segmento a segmento (build_segment), em três modos:
    • kbzKen Burns: zoompan com zoom de z0 a z1 e centro vertical cy, 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).
  2. Cartão final (card_final), 2,00s: fundo verde #0B4D2C e seis drawtext com 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.
  3. Concat mudoffmpeg -f concat -c copy, sem reencodar.
  4. Voz — concatena os .wav já aparados de 02_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).
  5. Mixagem — a trilha entra a 0.42 e passa por sidechaincompress abaixada 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 por adelay no milissegundo marcado. Fecha em alimiter a 0.95.
  6. Loudnessloudnorm em dois passos (ver lição 5).
  7. Legendagerar_ass() escreve o .ass e o filtro subtitles queima no vídeo.
  8. 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 .ass usa 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 lista LIN do card_final e o Style: do ASS_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_balance no começo e olhe unlimitedAppliesHere — se vier false, cada lote é dinheiro.

Preço unitário medido (20-21/08/2026)

RecursoCréditos
Nano Banana Pro / NB2 — 2k 9:1675
GPT-2 — 2k 9:16260
Kling 3.0 — 1080p90 por segundo (5s = 450 · 10s = 900)
Kling 3.0 Turbo — 5s 1080p1.300 — evitar (quase 3× o normal)
TTS, bloco curto20–52
Música, 60s1.200
SFX10–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

ItemCréditosFatia
Kling (5 clipes = 2.070 · combo do tetra refeito = 450 · clipe da menina refeito = 450)2.97045%
Trilha (um jingle instrumental de 60s)1.20018%
Todo o resto (as imagens, a locução — 8 blocos de locutor mais o diálogo criança/mãe —, 4 SFX)2.47537%
Total6.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 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.

Transcrição do vault. Mudou o arquivo lá? Atualize lib/guias.ts — o vault é a fonte, esta página é o espelho.