
Frame selection dinâmica é essencial para treinar LLMs em vídeo
O problema do orçamento de frames
Um modelo de visão LLM consegue processar realisticamente cerca de 150 imagens por vídeo. A amostragem uniforme (um frame por segundo ou por dez segundos) falha nos dois sentidos: enterra o modelo em frames quase idênticos de um talking head e pula justamente o segundo em que algo importante aconteceu. A raiz do problema é que o sampler não sabe o que mudou. Uma vez aceito o orçamento de 100-150 frames, extração deixa de ser o problema - seleção é o problema.
Detecção de cenas além do threshold fixo
O primeiro passo usa o score de cena do ffmpeg para capturar um frame a cada mudança de cena. Mas thresholds fixos falham em animação e movimentos de câmera lentos, onde a mudança é constante mas nunca abrupta. A solução: calcular scores por frame e manter um frame quando seu score supera um múltiplo da média móvel. Footage com muito movimento eleva sua própria barra; footage quieto a abaixa.
Três canais de deduplicação
A deduplicação evoluiu de um comparador único para três canais, cada um adicionado quando footage real expôs uma falha:
Canal global: assinatura RGB 16×16, descarta frames com menos de ~8% de pixels alterados. Compara contra uma janela deslizante dos últimos 4 frames mantidos (não apenas o anterior), para evitar re-admitir frames em cortes A-B-A.
Canal de ação: resolve o ponto cego do canal global para sujeitos pequenos. Uma pessoa ocupando 0,5% de um plano amplo nunca muda 8% dos pixels, então o momento importante é descartado. A correção: numa grade 32×32, se algumas células mudam fortemente (>45/255), o frame é mantido independentemente da porcentagem.
Canal de estado estável: detecta mudanças locais pequenas que o canal global não vê - troca de legenda, tinta aparecendo num quadro branco, elemento de UI atualizando. Opera numa assinatura 192×192 e procura pixels que diferem fortemente de todos os frames na janela. Um cooldown com decaimento impede que uma bandeira tremulando consuma todo o orçamento de frames.
Fusão com transcrição
O texto vem de legendas embutidas ou do Whisper local. Dois detalhes que custaram tempo de debug: o Whisper às vezes alucina segmentos muito além do fim do vídeo em áudio musical (solução: clamp na duração da mídia), e deixar o modelo juntar frames e transcrição por timestamp funciona em vídeos curtos mas desalinha silenciosamente em vídeos longos. A solução é pré-computar o join: cada segmento de transcrição lista os frames que caem dentro dele.
Ferramenta e MCP
Tudo está no claude-real-video, ferramenta open-source com licença MIT. A saída são arquivos simples: JPEGs, transcrição com timestamps e um manifesto que diz ao modelo como ler o pacote. Há também um servidor MCP (crv-mcp) que permite a qualquer cliente MCP (Claude Desktop, Cursor, Claude Code) chamar watch_video e obter o resultado fundido. Frames são redimensionados para 768px no lado longo e análises são cacheadas por fonte.
Limitações
Keyframes e transcrição fundida não capturam movimento de câmera, ritmo de cortes ou tom de voz. Mas para o caso cotidiano de "deixar o modelo assistir antes de responder", seleção mais fusão cobre uma quantidade surpreendente de terreno, inteiramente na máquina local.